在计算机中,所有运算都是采用补码方式进行计算的,正数的补码、反码和原码相同,负数的补码等于其反码+1
分析:假如负数为-13
原码 0000 0000 0000 0000 0000 0000 1000 1101
反码 1111 1111 1111 1111 1111 1111 1111 0010
补码 1111 1111 1111 1111 1111 1111 1111 0011
~ 0000 0000 0000 0000 0000 0000 0000 1100
+1 0000 0000 0000 0000 0000 0000 0000 1101(13)
发现-13的补码取反+1就是13,所以一个负数n的绝对值为 :~n+1
public static int absoluteValue(int a){
return (a >= 0) ? a : ~a + 1;
}
在分析:任何一个数异或0结果为其本身,与-1(二进制全为1)相当于取反,一个32bit的int类型的正数 >> 31结果为0,负数 >> 31为-1,所以
public static int absoluteValue(int a){
int b = a >> 31;
// 当a为正时:b = 0,a ^ b = a;
// 当a为负时:b = -1,a ^ b = ~a;
return (a ^ b) - b;// 也可以写为:(a ^ (a >> 31)) - (a >> 31)
}
注意:算术运算符优先级比位运算符高