您的位置:首页 > 编程语言 > Java开发

JAVA中的移位运算

2017-10-23 23:06 148 查看
JAVA中的移位运算符包括:右移(">>"),左移("<<"),无符号右移(">>>")。没有无符号左移

既然是移位运算就与二进制息息相关

如:int a = 9; a的二进制就为0000,1001,第一位0为符号位,代表为正数 

a>>1 等于 4,二进制表示就为0000,1001→0000,0100(高位以0填充)

a<<1 等于 18,二进制表示就为 0000,1001→0001,0010(低位以0填充)

对于正数,右移(">>")与无符号右移(">>>")没有区别:

a>>>1 等于4,二进制表示就为 0000,1001→0000,0100(高位以0填充)

接下来就是负数的移位

这里就需要提到,负数在计算机中是以其正值的补码形式存在的(补码为原码取反+1)

如:int b = -9; 其正值的二进制表示为0000,1001→反码1111,0110→补码1111,0111

所以b的二进制表示为1111,0111(由于int有32位,实际为1111,1111,1111,1111,1111,1111,1111,0111)

第一位1为符号位,代表负数

b>>1等于-5,二进制表示就为1111,0111→1111,1011(高位以1填充),由于第一位仍然为1,所以

为负数,需要将二进制重新转换为原码才能得到原本的值(原码同时也为补码取反+1)

1111,1011→取反0000,0100→加一0000,0101。所以结果为5加上负号为-5

b<<1等于-18,同理1111,0111→1110,1110(低位以0填充),取原码得到结果为0001,0010,结果为-18

b>>1等于2147483643。

通过上面的观察可以看出来,正数与负数在进行左移操作时,低位都是以0填充,而在进行右移操作时,正数

以0补充高位,负数以1补充高位,即为以符号位补充高位。

但是在无符号右移时,始终以0补充高位。这就是为什么对于正数,右移(">>")与无符号右移(">>>")没有区别。

所以b>>>1的运算过程如下:(32位)

1111,1111,1111,1111,1111,1111,1111,0111→0111,1111,1111,1111,1111,1111,1111,1011

由于第一位,也就是符号位为0,所以右移后由负数变为了正数,结果也就直接由右移后的值转换成十进制,

即:2147483643

(Tips:b为int型,占32位。若为long型占64位,那么b>>>1的值会很大噢。

除此之外,对于int型,移位运算符需要完成模32的操作(若为long型则需模64),

如:int p = 9; p >> 1 实际上与 p >> 33的值相同

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: