(目录)

符号位

二进制形式最左边的第一位是符号位

  • 0表示正数
  • 1表示负数

例如

十进制:1
二进制原码:00000000 00000000 00000000 00000001

十进制:-1
二进制原码:10000000 00000000 00000000 00000001

左移运算符<<

规则:丢弃左边指定位数,右边补0

示例

// 相当于 4 * 2^1 = 8
System.out.println(4 << 1); // 8

二进制计算

4 << 1

  00000000 00000000 00000000 00000100
=>
0|00000000 00000000 00000000 00001000

右移运算符>>

规则:丢弃右边指定位数,左边补上符号位

示例

// 相当于 4 / 2^1 = 2
System.out.println(4 >> 1); // 2

// 相当于 -4 / 2^1 = -2
System.out.println(-4 >> 1); // -2

二进制计算

-4 >> 1

原码:10000000 00000000 00000000 00000100
反码:11111111 11111111 11111111 11111011
补码:11111111 11111111 11111111 11111100
=>
补码:11111111 11111111 11111111 11111110|0
反码:11111111 11111111 11111111 11111101
原码:10000000 00000000 00000000 00000010

无符号右移运算符>>>

规则:丢弃右边指定位数,左边补上0

示例

System.out.println(4 >>> 1); // 2
System.out.println(-4 >>> 1); // 2147483646

二进制计算

-4 >>> 1

原码:10000000 00000000 00000000 00000100
反码:11111111 11111111 11111111 11111011
补码:11111111 11111111 11111111 11111100
=>
补码:01111111 11111111 11111111 11111110|0

其他

右移32位,相当于没有移动

// 移动位数大于等于32位操作时,会先求余(%)后再进行移位操作
System.out.println(4 >> 32); // 4
System.out.println(4 >> 0); // 4

参考文章