java中移位运算符的简单讲解

首先移位运算符有三种:

<<      :    左移运算符,

>>      :    右移运算符,

>>>    :    无符号右移,

无符号左移没有意义。故没有<<<。

实战举例:

正数的运算:

>>右移运算:

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

以上就是移位运算符的知识,差不多就这些了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章