位运算符中相关的移动符号:
<<:左移,将最高符号位舍弃掉,在右边补齐0
>>:右移符号: 如果最高符合为如果是0,在左边补齐0;最高符号位如果是1,左边补齐1
>>>:无符号右移:无论最高符号为是0还是1,始终在左边补齐0
//请用最有效的方式写出2乘以8 的结果
2 << 3 2 * 2^3
class OperatorDemo{
public static void main(String[] args){
//左移符号有一个结论:
//将该符号左边的数据本身乘以2的移动次幂 : 3 * 2 ^2 = 3 *4 = 12
System.out.println(3 << 2) ;
//右移符号有一个结论:
//将该符号左边的数据本身除以2的移动次幂: 24 / 2^2 = 24 / 4 = 6
System.out.println(24 >> 2) ;
System.out.println(-24 >> 2) ;
System.out.println(-24 >>> 2) ; //特点:无论最高符号位是0还是1,左边都补0
//1073741818
}
}
3 << 2 :将3这个数据左移动两位
计算出3对应的二进制数据:0b11
00000000 00000000 00000000 00000011 原码(同时也是反码和补码,正数)
补码:
00000000 00000000 00000000 00000011
(00)000000 00000000 00000000 0000001100 (使用补码左移动两位)
000000 00000000 00000000 0000001100:补码--->反码---原码(正数)
=12
24 >> 2 (将24右移2位)
先算出24对应的二进制:0b11000
00000000 00000000 00000000 00011000(正数:原码,反码,补码都相同)
补码
00000000 00000000 00000000 00011000
(00)00000000 00000000 00000000 000110(00) (正数:补码--反码--->原码)
0000000000 00000000 00000000 000110
结果:6
-24 >> 2
负数
(原码)
10000000 00000000 00000000 00011000
反码:
11111111 11111111 11111111 11100111
+1
-----------------------------------------------------
补码:
11111111 11111111 11111111 11101000
1111111111 11111111 11111111 111010(00) (换算移动后的补码)
补码
1111111111 11111111 11111111 111010
-1
-------------------------------------------------
反码
1111111111 11111111 11111111 111 001
原码
1000000000 00000000 00000000 000110
-24 >>> 2
-24的原,反,补
负数
(原码)
10000000 00000000 00000000 00011000
反码:
11111111 11111111 11111111 11100111
+1
-----------------------------------------------------
补码:
11111111 11111111 11111111 11101000
无符号右移
11111111 11111111 11111111 11101000
0011111111 11111111 11111111 111010(00)
0011111111 11111111 11111111 111010 (正数:补码–反码–原码)