目录
- 符号位
- 左移运算符<<
- 右移运算符>>
- 无符号右移运算符>>>
- 其他
符号位
二进制形式最左边的第一位是符号位
- 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
参考文章