了解Java中的移位运算符和二进制

在Java中>>,<< 和>>>是什么意思?

它们都是移位运算符,移位运算符就是在二进制的基础上对数字进行平移。按照平移方向和填充数字的规则(按左右分,低位补0或者高为补0)分为:>>(带符号右移),<<(左移)和>>>(无符号右移)。

"<<“和”>>"的平移规则是:将数字变为二进制,然后在二进制的的形式下将所有数字(二进制的数字)向左(或向右)平移,高位移出(舍弃),低位补0(高位移出几个就补几个)【低位移出(舍弃),高位补0(低位移出几个就补几个)】
语法为:
需要移位的数字 << (>>)移位的次数
例如:
5>>1
我们知道5的二进制数为00000000 00000000 00000000 00000101
5带符号右移1次,就是将最右边的数字去掉一个,也就是去掉“1”,那么 5>>1就会变为00000000 00000000 00000000 00000010,转换为十进制就是2.
左移二进制就变为:00000000 00000000 00000000 00001010,转换为十进制就是10

“>>>”的平移规则是:如果是正整数那么和带符号右移相同,如果是负整数则不同。

如果想要知道为什么不同,那么就要先了解正数负数的二进制差别:
在二进制中,数字的二进制分为原码,反码和补码。

在原码当中:用符号位和数值表示带符号数,正数的符号位用“0”表示,负数的符号位用“1”表示,数值部分用二进制形式表示。

在计算机中,负数以原码的补码形式表达

原码:按正负区分,都是按照绝对值大小转化为二进制数;不过正数的符号位为0,负数的符号位为1,所以按照绝对值的话,负数的最高位(最左边)需要补上一个1(可用来判断这个二进制是负数还是正数)。

如:3和-3的原码分别是:
00000000 00000000 00000000 00000011
10000000 00000000 00000000 00000011

反码:正数的反码与原码相同;而负数的反码则是除符号位外全部取反(0变为1,1变为0)

如:3和-3的反码分别是:
00000000 00000000 00000000 00000011
11111111 11111111 11111111 11111100

补码:正数的补码与原码相同;而负数的补码则是除符号位外全部取反,然后在最后一位加1.

如:3和-3的补码分别是:
00000000 00000000 00000000 00000011
11111111 11111111 11111111 11111100

又如-2:
原码为:10000000 00000000 00000000 00000010
反码为:11111111 11111111 11111111 11111101
补码为:11111111 11111111 11111111 11111110

二进制的运算:

运算 情况
加法 0+0=0,0+1=1,1+0=1,1+1=10(0 进位为1)【异取1,同0为0,同1 为10】
减法 0-0=0,1-0=1,1-1=0,0-1=1【同取0,异取1】
乘法 0×0=0,1×0=0,0×1=0,1×1=1【异取0,同0为0,同1为1】
除法 0÷1=0,1÷1=1(除数只能为1)【异取0,同取1】

(小知识:被除数÷除数;二进制中只有0和1 10 在十进制中就是1×2¹+0×2º = 2)

现在我们知道了“正数”与“负数”二进制的差别,就可以知道为什么>>(带符号右移)和>>>(无符号右移)有区别了:

如-3>>1为11111111 11111111 11111111 11111110 最左位为1是符号位(带着),转换为十进制就是-2

-3>>>1为01111111 11111111 11111111 11111110 最左位为0(因为不带无符号位)所以转化为十进制就是2147483646

(知识点:Java中可以运用Integer.toBinaryString(所需转换为二进制的数),将数字转换为二进制)

你可能感兴趣的:(了解Java中的移位运算符和二进制)