Java的取反运算(~),从二进制层面讲解

~取反运算

例子:

正数取反运算

150000 0000 0000 0000 0000 0000 0000 1111
取反运算(得到的是补码):1111 1111 1111 1111 1111 1111 1111 0000
转原码:
1111 1111 1111 1111 1111 1111 1111 0000
                                     -1
1111 1111 1111 1111 1111 1111 1110 1111                                     
取反得原码(符号位不变):1000 0000 0000 0000 0000 0000 0001 0000-16

负数取反运算(负数在计算机中以补码形式存储)

-151000 0000 0000 0000 0000 0000 0000 1111
转原码:
1000 0000 0000 0000 0000 0000 0000 1111
                                     -1
1000 0000 0000 0000 0000 0000 0000 1110
取反得原码(符号位不变):1111 1111 1111 1111 1111 1111 1111 0001    
取反运算:0000 0000 0000 0000 0000 0000 0000 111014

所以,在转原码的取反操作时,符号位不变,这次取反不是取反运算
取反运算是直接对原码进行的

正数是先直接取反运算,再转原码取值。
负数是先转原码,在进行取反运算取值。

简便方法
也可以用适合人类运算的计算方法:
如对 a 按位取反,则得到的结果为 -(a+1) .
此条运算方式对正数负数和零都适用。

参考:https://www.cnblogs.com/shuaiding/p/11124974.html

你学废了吗?

猜你喜欢

转载自blog.csdn.net/Brave_heart4pzj/article/details/114642199