繁体   English   中英

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

[英]the difference between a | b and a + b when a or b is zero

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

但是,当我替换“ |”时 最后一行带有“ +”,则当x = 0x80000000,y = 0x80000000,z = 0x7fffffff时,代码将失败。 它返回0而不是0x80000000。

所以我的问题是:为什么以下失败? 谢谢!

((v<<31)>>31)&y + ((~v<<31)>>31)&z

编辑:我了解 是按位或,而+是加法。 但是在这种情况下,v为1或零,因此(v << 31)>> 31)要么全为1,要么全为零。 y | 0x00000000应该和y + 0x00000000一样,对吗? 具体来说,v为1,因此上述输入的结果应为y,但使用“ +”时返回0。

恐怕我们必须使用数学。

变量的最高位被设置,因此加倍等于左移1位,这等于溢出。 其余所有位均为0。因此,结果为0。

请记住| 是按位|| 并且不会将值保留到其他二进制数字。 +做。

因此,如果ab是您的位向量空间的orthogonal base函数/向量(在您的情况下不成立), a|ba+b是相等的-但只有那时是相等的。


更新:

根本原因是运算符优先级:(降序) + & |

所以

((v<<31)>>31)&y + ((~v<<31)>>31)&z

变成

((v<<31)>>31) & (y + ((~v<<31)>>31)) & z

以二进制形式,10 + 01 = 11和10 | 01 =11。但是10 + 10 = 100,而10 | 10 = 10。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM