a |之间的区别当a或b为零时,b和a + b

时间:2014-04-08 21:48:08

标签: c

我正在尝试使用位操作在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;使用。

2 个答案:

答案 0 :(得分:4)

恐怕我们必须使用数学。

设置变量的最高位,因此加倍等于1左移位,这等于溢出。所有剩余的比特都是0.因此你得到0作为结果。

请注意,|是一个按位||,并且不会将值转移到其他二进制数字。 +确实如此。

所以说,如果ab是你的bitvectorspace的orthogonal base个函数/向量(在你的情况下不是真的那样)a|ba+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。