可以通过以下位运算得到整数的绝对值
公共in tabs (inta ) {
返回(a (a31 ) ) ^ ) a31; //前半-1或0,后半相反
}
在a为正的情况下,向右移位31位
a31=0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
在a为负数的情况下,向右移位31位
a31=111111111111111111111111111111111111111111111111
因此,很明显,a为正数时公式成立,a为负数时是求a补数过程的逆过程
求补数的过程如下
正数的原码---求逆得到补数---再加1得到补数
举个-1试试
-1的绝对值源代码
00000000 00000000 00000000 00000001
-----------------
先求反。 这里求反可以用异或得到。 也就是说
00000000 00000000 00000000 00000001
^
11111111 11111111 11111111 11111111
得到反码
11111111 11111111 11111111 11111110
-----------------
再加1得到补数
11111111 11111111 11111111 11111110
00000000 00000000 00000000 00000001
补码
11111111 11111111 11111111 11111111
所以-1的补码是
所以-1的补码是
现在把这个过程倒过来就行了
这里,补充-1得到反码,-1在计算机中是(-1 )
11111111 11111111 11111111 11111111
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
得到反码
1111111111111111111111111111111111111111111----最高位过境直接丢失
-----------------
将反码转换为原始代码是通过异或操作获得的
11111111 11111111 11111111 11111110
^
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
拿到原码
00000000 00000000 00000000 00000001
因此,-1的源代码为0000000000000000000000000000000000000000001,其绝对值为-1,即1。
从上面的推送过程可以看出整数的绝对值相等
(a ) a31 ) (^ (a31 ) ) ) ) ) )。