【java基础】-java移位运算符:右移运算符和无符号右移运算符

下表列出了位运算符的基本运算,假设整数变量A的值为60和变量B的值为13:

操作符描述例子
如果相对应位都是1,则结果为1,否则为0(A&B),得到12,即0000 1100
|如果相对应位都是0,则结果为0,否则为1(A | B)得到61,即 0011 1101
^如果相对应位值相同,则结果为0,否则为1(A ^ B)得到49,即 0011 0001
按位取反运算符翻转操作数的每一位,即0变成1,1变成0。(〜A)得到-61,即1100 0011
<< 按位左移运算符。左操作数按位左移右操作数指定的位数。A << 2得到240,即 1111 0000
>> 按位右移运算符。左操作数按位右移右操作数指定的位数。A >> 2得到15即 1111
>>> 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。A>>>2得到15即0000 1111

 

下面就详解"<<",">>",">>>"这三个移位运算符!

1.有符号右移运算符  >>

右移的规则只记住一点:该数对应的二进制码补码整体右移,左边的用符号位补充,右边超出的部分舍弃 

补充一句:操作数在计算中都是用补码来表示的。

正数的右移n位等于===原操作数/2^n

负数的比较复杂。

60移位前二进制(补码表示):
111100    60
-60移位前二进制(补码表示):
11111111111111111111111111000100    -60

右移的规则只记住一点:该数对应的二进制码整体右移,左边的用符号位补充,右边超出的部分舍弃 
60右移1位的二进制(补码表示):
11110    30
60右移5位的二进制(补码表示):
1    1
60右移6位的二进制(补码表示):
0    0
-60右移1位的二进制(补码表示):
11111111111111111111111111100010    -30
-60右移5位的二进制(补码表示):
11111111111111111111111111111110    -2
-60右移6位的二进制(补码表示):
11111111111111111111111111111111    -1

2.无符号右移运算符  >>>

 无符号右移的规则只记住一点:该数对应的二进制码补码整体右移,左边部分总是以0填充,右边超出的部分舍弃

正数的>>>和>>一样  正数的>>>n位等于===原操作数/2^n

负数的比较复杂,移动一位就变成了正数了。

60移位前二进制(补码表示):
111100    60
-60移位前二进制(补码表示):
11111111111111111111111111000100    -60


60无符号右移1位的二进制(补码表示):
11110    30
60无符号右移5位的二进制(补码表示):
1    1
60无符号右移6位的二进制(补码表示):
0    0
-60无符号右移1位的二进制(补码表示):
1111111111111111111111111100010    2147483618
-60无符号右移5位的二进制(补码表示):
111111111111111111111111110    134217726
-60无符号右移6位的二进制(补码表示):
11111111111111111111111111    67108863

3.左移运算符   <<

左移的规则只记住一点:该数对应的二进制码补码整体左移,丢弃最高位,0补最低位

如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了33%32=1位;

当左移的运算数是int 类型时,每移动1位它的第31位(0~31)就要被移出并且丢弃;
当左移的运算数是long 类型时,每移动1位它的第63(0~63)位就要被移出并且丢弃。
当左移的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型。

正数和负数的左移操作分两种情况:

(1)左移n位(1<=n<=31)之后操作数没有溢出

         这种情况等价于===原操作*2^n,例如60的二进制补码是 111100=2^5+2^4+2^3+2^2=60

60左移25位之后的二进制补码为:01111000000000000000000000000000 =(2^5+2^4+2^3+2^2)*2^25=2^30+2^29+2^28+2^27

而int类型占四个字节,一共三十二位,第一位是符号位,int类型的数值范围是(-2^31~2^31-1)所以60左移25位操作数没有溢出,最高位还是0;

(2)左移n位(1<=n<=31)之后操作数溢出

但如果再向左移动一位的话,即60左移26位之后的二进制补码为:

11110000000000000000000000000000 =(2^5+2^4+2^3+2^2)*2^26=2^31+2^30+2^29+2^28

此时二进制最高位是1,操作数溢出,变成负数。

60移位前二进制(补码表示):
111100    60
-60移位前二进制(补码表示):
11111111111111111111111111000100    -60

左移的规则只记住一点:丢弃最高位,0补最低位
60左移1位的二进制(补码表示):
1111000    120
60左移25位的二进制(补码表示):
1111000000000000000000000000000    2013265920
60左移26位的二进制(补码表示):
11110000000000000000000000000000    -268435456
60左移30位的二进制(补码表示):
0    0
-60左移1位的二进制(补码表示):
11111111111111111111111110001000    -120
-60左移25位的二进制(补码表示):
10001000000000000000000000000000    -2013265920
-60左移26位的二进制(补码表示):
10000000000000000000000000000    268435456
-60左移32位的二进制(补码表示):
11111111111111111111111111000100    -60

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值