初识:
<<(左移)、>>(带符号右移)和>>>(无符号右移) (符号: 最高位 0 正数,1负数)。注意当刚好为数据长度的整数倍时,即32、64······,数据保持原来不变;其他情况下移动除以 32 余数的长度。
<<
:例如 5<<1
-> 二进制为 0101 整体左移一位,缺的以0补足,变成 101 0 = 10 相当于 5 * 2 = 10。
>>
:例如 10>>1
->二进制为 1010 整体右移一位,正数高位为0,变成 0101 相当于 10 / 2 = 5。
例如-5 >>1 -> -3
,具体怎么来的下面详细介绍
计算机用补码来表示数字,正数的补码等于他的原码 。负数的补码等于他的原码自低位向高位,尾数的第一个‘1’及其右边的‘0’保持不变,左边的各位按位取反,符号位不变。
例如 :
-5 的原码为
10000000 00000000 00000000 00000101
那么 -5 的补码为(注意右边出现的第一个一)
11111111 11111111 11111111 11111011
现在再来右移
111111111 11111111 11111111 1111101
那么它的原码为
10…11 =-3
同理,可以自行测试
System.out.println(Integer.toBinaryString(Integer.MAX_VALUE));//01111111111111111111111111111111
System.out.println(Integer.toBinaryString(Integer.MAX_VALUE<<1));//11111111111111111111111111111110
System.out.println(Integer.MAX_VALUE<<1);//-2 11111111111111111111111111111110 的原码 10......010 = -2
>>>
:无符号右移
最高位为0,那么上面-5>>>1
就变成
01111111111111111111111111111101 = 2147483645