(图解)JAVA负数位运算(随记)
最近遇到个负数位运算的问题,搞了半天才明白,记录一下以便后面忘掉再复习。
在计算机系统中,数值一律用补码来表示(存储)。
上图纯属个人理解,有错立改
实战一下:
右移: -5>>2
-5源码(负数最高位为1,其他按其绝对值取):
10000000 00000000 00000000 00000101
-5反码(最高位不变,其他位取反):
11111111 11111111 11111111 11111010
-5补码 (给反码进行+1操作):
11111111 11111111 11111111 11111011
对补码进行右移两位(最高位不变,次高两位补1,末尾两位去掉)
11111111 11111111 11111111 11111110
(新值补码)
新值的补码:
11111111 11111111 11111111 11111110
新值的反码(对新值进行-1操作):
11111111 11111111 11111111 11111101
新值源码(最高位不变,其他位取反):
10000000 00000000 00000000 00000010
-5右移两位后的新值:-2
左移: -5<<2
-5补码 (给反码进行+1操作):
11111111 11111111 11111111 11111011
对补码进行左移两位(最高位不变,次高两位去掉,末尾补两位0)
11111111 11111111 11111111 11101100
新值补码:
11111111 11111111 11111111 11101100
新值反码(对新值补码尽心-1操作)
11111111 11111111 11111111 11101011
新值(对反码进行最高位不变,其他位取反)
10000000 00000000 00000000 00010100
-5左移两位后的新值:-20
位 : []
1 bit/boolean : 1
1 byte : 11111111
1 short/char : 11111111 11111111
1 int/float : 11111111 11111111 11111111 11111111
1 long/double : 11111111 11111111 11111111 11111111
11111111 11111111 11111111 11111111