逻辑NOT(!)运算符不适用于按位语句

Row*_*awn 2 c bit-manipulation bitwise-operators logical-operators

我试图确定是否可以计算两个32位整数的总和而不溢出,同时仅使用某些按位运算符和其他运算符.因此,如果可以在不溢出的情况下添加整数x和y,则以下代码应返回1,否则返回0.

(((((x >> 31) + (y >> 31)) & 2) >> 1))
Run Code Online (Sandbox Code Playgroud)

但是,它应该为1时返回0,反之亦然.当我使用逻辑NOT(!)运算符,或按位XOR(^)与0x1时,它不能解决问题.

!(((((x >> 31) + (y >> 31)) & 2) >> 1))

(((((x >> 31) + (y >> 31)) & 2) >> 1) ^ 0x1)
Run Code Online (Sandbox Code Playgroud)

^这些不起作用.

提前致谢.

And*_*per 8

这有点清洁:

~(x & y) >> 31
Run Code Online (Sandbox Code Playgroud)

更新

克里斯的评论是正确的.所有这些代码都检查两个MSB是否都已设置.

我只是看着kriss的答案,我发现只使用一个加法,加上按位运算符,假设无符号整数,就可以完成同样的事情.

((x & 0x7FFFFFFF) + (y & 0x7FFFFFFF)) & 0x80000000 & (x | y)
Run Code Online (Sandbox Code Playgroud)

第一个带括号的部分将MSB都设置为0,然后添加结果.任何进位都将以结果的MSB结束.随身携带的下一个bitmask隔离区.最后一项检查x或y上的集合MSB,这导致整体进位.要满足问题中的规范,请执行以下操作:

~(((x & 0x7FFFFFFF) + (y & 0x7FFFFFFF)) & 0x80000000 & (x | y)) >> 31
Run Code Online (Sandbox Code Playgroud)