原码、反码、补码、位运算

原码

以整数 5 为例,2进制 可得:

00000000 00000000 00000000 00000101 (原码)

将第 1 位来表示符号位,0代表正,1代表负。所以 -5 可用:

10000000 00000000 00000000 00000101 (原码)
反码

正数的反码和原码一样,负数的反码就是在原码的基础上符号位保持不变,其他位取反。还是以整数 5 为例,反码如下:

00000000 00000000 00000000 00000101 (反码)

再以整数 -5 为例,反码如下:

11111111 11111111 11111111 11111010 (反码)
补码

正数的补码和原码一样,负数的补码就是反码+1。还是以整数 5 为例,补码如下:

00000000 00000000 00000000 00000101 (补码)

再以整数 -5 为例,补码如下:

11111111 11111111 11111111 11111011 (补码)
<< (左移)

正负整数规则相同,向左被移出的位被丢弃,右侧用 0 补充。在使用补码作为机器数的机器中,以整数 5 << 2 为例:

00000000 00000000 00000000 00000101 (5 补码)
00000000 00000000 00000000 00010100 (5 << 2)

同样,以 -5 << 2 为例:

10000000 00000000 00000000 00000101 (-5 原码)
11111111 11111111 11111111 11111011 (-5 补码)
11111111 11111111 11111111 11101100 (-5 << 2 补码)
10000000 00000000 00000000 00010100 (-5 << 2 原码)

所以结果 5 << 2 = 20,-5 << 2 = -20 ,在数字没有溢出的前提下,在数字 x << y = x * 2y

>> (有符号右移)

该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,拷贝最左侧的位以填充左侧。以整数 5 >> 2 为例:

00000000 00000000 00000000 00000101 (5 补码)
00000000 00000000 00000000 00000001 (5 >> 2 = 1)

以整数 -5 >> 2 为例:

11111111 11111111 11111111 11111011 (-5 补码)
11111111 11111111 11111111 11111110 (5 >> 2 补码)
10000000 00000000 00000000 00000010 (-2 原码)
>>> (无符号右移)

该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,左侧用0填充。因为符号位变成了 0,所以结果总是非负的。对于非负数,有符号右移和无符号右移相同。以整数 5 >>> 2 为例:

00000000 00000000 00000000 00000101 (5 补码)
00000000 00000000 00000000 00000001 (5 >>> 2 = 1)

而对于-5 >>> 2 来说:

11111111 11111111 11111111 11111011 (-5 补码)
00111111 11111111 11111111 11111110 (-5 >>> 2 补码)
00111111 11111111 11111111 11111110 (-5 >>> 2 原码)
上一篇:浅谈数据结构与算法


下一篇:终于我用JOL打破了你对java对象的所有想象