使用位运算符的条件语句

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】:

我会使用!!aa 转换为布尔值,以获得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

以上是关于使用位运算符的条件语句的主要内容,如果未能解决你的问题,请参考以下文章

Shell-条件测试和判断语句

Shell-条件测试和判断语句

python基础 运算符优先级位运算符条件判断语句while循环循环嵌套

python基础:变量编码运算符条件语句while循环

7.JavaScript运算符和条件分支语句

[Golang]运算符,条件控制语句--[if]-[if-else]-[for]-[switch]-[goto]