这个问题在这里已经有了答案:
How to compute the integer absolute value
(11 个回答)
去年关闭。
这是如何运作的?
这个想法是让abs(x)
对整数使用按位运算符(假设为 32 位字):
y = x >> 31
(x + y) ^ y // This gives abs(x) (is ^ XOR)?
最佳答案
假设 32 位字,如问题所述:
对于负 x
, x >> 31
在 C 和 C++ 标准中是实现定义的。代码的作者期望整数的补码和算术右移,其中 x >> 31
如果 x
的符号位产生全零位如果符号位为 1,则为零且全为 1。
因此,如果 x
为正数或零,y
为零,并且 x + y
是 x
, 所以 (x + y) ^ y
是 x
,即 x
的绝对值.
如 x
为负,y
全为 1,表示为 2 的补码中的 -1。然后x + y
是 x - 1
.然后与所有 1 进行异或将所有位反转。将所有位取反相当于取二的补码减一,二的补码是用来取反二进制补码格式的整数的方法。换句话说,异或运算 q
所有的给 -q - 1
.所以x - 1
与所有的异或产生 -(x - 1) - 1
= -x + 1 - 1
= -x
,即 x
的绝对值除非 x
是格式的最小可能值(-2,147,483,648 表示 32 位二进制补码),在这种情况下,绝对值 (2,147,483,648) 太大而无法表示,结果位模式只是原始 x
.
关于c++ - 使用按位运算符和 bool 逻辑的绝对值 abs(x),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60601908/