我正在尝试使用位操作在C中实现if语句。以下代码似乎有效:
// if (x) then y else z
int conditional(int x, int y, int z) {
int v = (!!x); //v is 1 or 0
return ((v<<31)>>31)&y | ((~v<<31)>>31)&z;
}
然而,当我更换&#34; |&#34;用&#34; +&#34;在最后一行中,当x = 0x80000000,y = 0x80000000,z = 0x7fffffff时,代码失败。它返回0而不是0x80000000。
所以我的问题是:为什么以下失败?谢谢!
((v<<31)>>31)&y + ((~v<<31)>>31)&z
编辑: 我明白了是按位OR,+是加法。但是在这种情况下,v是1或0,因此(v <&lt; 31)&gt;> 31)是全部或全部为零。 y | 0x00000000应该与y + 0x00000000相同,对吗?具体来说,v是1.所以上面输入的结果应该是y,但是当&#34; +&#34;使用。
答案 0 :(得分:4)
恐怕我们必须使用数学。
设置变量的最高位,因此加倍等于1左移位,这等于溢出。所有剩余的比特都是0.因此你得到0作为结果。
请注意,|
是一个按位||
,并且不会将值转移到其他二进制数字。 +
确实如此。
所以说,如果a
和b
是你的bitvectorspace的orthogonal base
个函数/向量(在你的情况下不是真的那样)a|b
和a+b
是平等的 - 但只有这样。
更新
此处的根本原因是运算符优先级:(递减顺序)+
&
|
。
所以
((v<<31)>>31)&y + ((~v<<31)>>31)&z
成为
((v<<31)>>31) & (y + ((~v<<31)>>31)) & z
答案 1 :(得分:2)
二进制,10 + 01 = 11和10 | 01 = 11.但是10 + 10 = 100,而10 | 10 = 10。