使用位运算符的条件语句
Posted
技术标签:
【中文标题】使用位运算符的条件语句【英文标题】:Conditional Statement using Bitwise operators 【发布时间】:2012-04-19 12:56:45 【问题描述】:所以我看到这个问题已经被问过了,但是答案有点模糊和无益。好的,我只需要使用 "& ^ ~ ! + | >> 来实现一个 c 表达式
表达式需要类似于:a ?乙:c
所以,据我所知,表达式需要类似于:
return (a & b) | (~a & c)
这在 a = 0 时有效,因为将其与 b 相加将给出零,然后 or 表达式将返回右侧,(~a & c)
之所以有效,是因为 ~0 给出了全一,并且将 c 与全一相加返回 c .
但是,当 a > 0 时,这不起作用。有人可以尝试解释这是为什么,或者如何解决它吗?
【问题讨论】:
【参考方案1】:换句话说,如果 a 为 false
(即 0),则您需要 a
将所有位设置为 0,如果 a
为真(即 a > 0
),则将所有位设置为 1 )。
对于前一种情况,工作已经为您完成;对于后者——尝试计算表达式~!1
的结果。
【讨论】:
嗯,这就是我最初的想法。 ~!1 会给所有完美的。但是,如果我要做 ~!a,并且 a = 0,那么 ~!0 会给我 1110,所以我不知道从这里做什么 /:【参考方案2】:我会使用!!a
将a
转换为布尔值,以获得0 或1。x = !!a
。
然后我会在二进制补码中否定它。由于您没有可用的一元减号,因此您使用 2 的补码否定的定义:反转位,然后加一:y = ~x + 1
。这将清除所有位,或设置所有位。
然后我将and
直接与一个变量y & b
一起使用,与另一个变量相反:~y & c
。这将为其中一个表达式提供 0,而为另一个表达式提供原始变量。当我们or
将它们放在一起时,零将不起作用,因此我们将获得原始变量,保持不变。
【讨论】:
这实际上是完美的。那么为什么添加一个会使所有位设置或清除?我明白为什么会这样,但我不明白这是怎么发生的。 如果我们从 0 开始,那么翻转位会得到所有的 1。当我们加一时,所有这些都归零(进位被设置,但我们忽略它)。如果我们从 1 开始,翻转位会得到 111...10。添加 1 将最后一个 0 变为 1,因此所有位现在都是 1。y = ~x + 1
部分让我感到困惑;我终于认为它在 x = 0 的情况下由于整数溢出而起作用,但这并不明显。对我来说更明确的解决方案是首先将 lsb 移动到 msb 左移(00000001 => 10000000),然后复制 msb 右移:y = (x << 31) >> 31
以上是关于使用位运算符的条件语句的主要内容,如果未能解决你的问题,请参考以下文章