所以我看到这个问题已经被问到,但是答案有点模糊和无益。好的,我只需要使用“& ^〜!+ | >> < <”使用按位运算符的条件语句
该表达式需要类似于:a? B:C
所以,从我已经能够看出来,表达需要看起来像:
return (a & b) | (~a & c)
这个工作当a = 0,因为用b安定它会给零,然后或表达式将返回右边,(~a & c)
这是可行的,因为〜0给出所有的1,并且与所有1一起返回c。
但是,当a> 0时,这不起作用。有人可以试图解释为什么这是或者如何解决它?
所以我看到这个问题已经被问到,但是答案有点模糊和无益。好的,我只需要使用“& ^〜!+ | >> < <”使用按位运算符的条件语句
该表达式需要类似于:a? B:C
所以,从我已经能够看出来,表达需要看起来像:
return (a & b) | (~a & c)
这个工作当a = 0,因为用b安定它会给零,然后或表达式将返回右边,(~a & c)
这是可行的,因为〜0给出所有的1,并且与所有1一起返回c。
但是,当a> 0时,这不起作用。有人可以试图解释为什么这是或者如何解决它?
我会使用!!a
将a
转换为布尔值,得到0或1. x = !!a
。
然后我会否定这个补码。由于您没有一元可用,您可以使用2的补码取反的定义:反转位,然后添加一个:y = ~x + 1
。这将会清除所有位,或设置所有位。
然后,我会and
,直接与一个变量y & b
,它与其他反向:~y & c
。这将为其中一个表达式赋予0,另一个赋予其原始变量。当我们将or
加在一起时,零点将不起作用,所以我们会得到原始变量,保持不变。
换句话说,需要a
具有设置为0的所有位,如果是false
(即0),并已所有位设置为1,如果a
为真(即a > 0
)。
对于前一种情况,工作已经完成,对于后者 - 尝试找出表达式~!1
的结果。
那么这就是我第一次想到的。 〜!1会给所有完美的。但是,如果我要做〜!a和a = 0,那么〜!0会给我1110,所以我不知道该从哪里做什么/: – atb 2012-04-05 19:13:26
这实际上是完美的。那么为什么添加一个可以设置所有位或清除?我明白为什么需要这样做,但我不明白这是怎么发生的。 – atb 2012-04-05 19:22:11
如果我们从0开始,那么翻转所有的位。当我们添加一个时,所有这些都变回零(并且进位被设置,但我们忽略它)。如果我们从1开始,翻转这些位给出111 ... 10。添加1转,持续0到1,所有的位现在是1。 – 2012-04-05 19:24:26
'y =〜x + 1'部分让我感到困惑;在x = 0的情况下,我终于认为它的工作原因是整数溢出,但这并不明显。 对我来说,更清晰的解决方案是首先将lsb移到msb左移(00000001 => 10000000),然后将msb右移: 'y =(x << 31) >> 31' – 2017-09-04 20:48:39