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)
^这些不起作用.
提前致谢.
这有点清洁:
~(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)
| 归档时间: |
|
| 查看次数: |
1890 次 |
| 最近记录: |