2012-04-05 92 views
9

所以我看到这个问题已经被问到,但是答案有点模糊和无益。好的,我只需要使用“& ^〜!+ | >> < <”使用按位运算符的条件语句

该表达式需要类似于:a? B:C

所以,从我已经能够看出来,表达需要看起来像:

return (a & b) | (~a & c)

这个工作当a = 0,因为用b安定它会给零,然后或表达式将返回右边,(~a & c)这是可行的,因为〜0给出所有的1,并且与所有1一起返回c。

但是,当a> 0时,这不起作用。有人可以试图解释为什么这是或者如何解决它?

回答

15

我会使用!!aa转换为布尔值,得到0或1. x = !!a

然后我会否定这个补码。由于您没有一元可用,您可以使用2的补码取反的定义:反转位,然后添加一个:y = ~x + 1。这将会清除所有位,或设置所有位。

然后,我会and,直接与一个变量y & b,它与其他反向:~y & c。这将为其中一个表达式赋予0,另一个赋予其原始变量。当我们将or加在一起时,零点将不起作用,所以我们会得到原始变量,保持不变。

+0

这实际上是完美的。那么为什么添加一个可以设置所有位或清除?我明白为什么需要这样做,但我不明白这是怎么发生的。 – atb 2012-04-05 19:22:11

+0

如果我们从0开始,那么翻转所有的位。当我们添加一个时,所有这些都变回零(并且进位被设置,但我们忽略它)。如果我们从1开始,翻转这些位给出111 ... 10。添加1转,持续0到1,所有的位现在是1。 – 2012-04-05 19:24:26

+0

'y =〜x + 1'部分让我感到困惑;在x = 0的情况下,我终于认为它的工作原因是整数溢出,但这并不明显。 对我来说,更清晰的解决方案是首先将lsb移到msb左移(00000001 => 10000000),然后将msb右移: 'y =(x << 31) >> 31' – 2017-09-04 20:48:39

3

换句话说,需要a具有设置为0的所有位,如果是false(即0),并已所有位设置为1,如果a为真(即a > 0)。

对于前一种情况,工作已经完成,对于后者 - 尝试找出表达式~!1的结果。

+0

那么这就是我第一次想到的。 〜!1会给所有完美的。但是,如果我要做〜!a和a = 0,那么〜!0会给我1110,所以我不知道该从哪里做什么/: – atb 2012-04-05 19:13:26