首先移位运算符有三种:
<< : 左移运算符,
>> : 右移运算符,
>>> : 无符号右移,
无符号左移没有意义。故没有<<<。
实战举例:
正数的运算:
>>右移运算:
Integer in=24;
//用Integer类的toBinaryString方法获得二进制表示
System.out.println(Integer.toBinaryString(in));
//右移 1 位
System.out.println(in>>1);
//右移 2位
System.out.println(in>>2);
//右移 3位
System.out.println(in>>3);
得到:
in用二进制表示:11000
右移 1 位的 in=12
右移 2 位的 in=6
右移 3 位的 in=3
不难得出结论:x >> y相当于x / 2^y 。
图例展示移位过程:
in用二进制表示:
00000000000000000000000000011000 int类型为8个字节占32二进制位
右移 1 位的 in=12
00000000000000000000000000001100
右移 2 位的 in=6
00000000000000000000000000000110
右移 3 位的 in=3
00000000000000000000000000000011
同理可证:x << y 相当于 x * 2^y 。
负数的运算:
>>右移运算:
Integer in=-24;
//用Integer类的toBinaryString方法获得二进制表示
System.out.println(Integer.toBinaryString(in));
//右移 1 位
System.out.println(in>>1);
//右移 2位
System.out.println(in>>2);
//右移 3位
System.out.println(in>>3);
得到:
in用二进制表示:11111111111111111111111111101000
右移 1 位的 in=-12
右移 2 位的 in=-6
右移 3 位的 in=-3
同样也能得出结论:x >> y相当于x / 2^y。
相反,<<左移运算也能得出 x << y 相当于 x * 2^y 。
但是有个点得注意,因为负数用二进制表示最高位是1,因此当负数过小时,就会出现这种情况。
Integer in=-3;
//用Integer类的toBinaryString方法获得二进制表示
System.out.println(Integer.toBinaryString(in));
//右移 1 位
System.out.println(in>>1);
//右移 2位
System.out.println(in>>2);
//右移 3位
System.out.println(in>>3);
得到:
in用二进制表示:11111111111111111111111111111101
右移 1 位的 in=-2
右移 2 位的 in=-1
右移 3 位的 in=-1
不难看出,负数右移的界限为-1;
这儿就可以简单的延伸下在计算机底层的补码原则,即:补码=反码+1。
1.先将-5的绝对值转换成二进制,即为0000 1010;
2.然后求该二进制的反码,即为 1111 0101;
3.最后将反码加1,即为:1111 0110
这个原则是为了避免正负转换时出现的漏洞人为约定的原则(因为有效果)。
具体的内容可以自行去看看~
>>>无符号位移
简单说,10进制数字转换为二进制之后,在右移的过程中,左边最高位都补0
Integer in=-3;
//右移 1 位
System.out.println(in>>>1);
得到:
右移 1 位的 in=2147483646
用二进制表示:
in用二进制表示:
11111111111111111111111111111101
右移 1 位的用二进制表示:
01111111111111111111111111111110
以上就是移位运算符的知识,差不多就这些了。