Java中的移位操作符

Java中移位操作符有三个:<<、>>、>>>,分别叫做左移位操作符、有符号右移位操作符、无符号右移操作符。

左位移操作符(<<):无论是有符号数还是无符号数,都低位补0。

有符号右移位操作符(>>):用符号扩展,为正高位补0,为负高位补1。

无符号右移操作符(>>>):无论是有符号数还是无符号数,都高位补0,称为零扩展。(C/C++无此操作符)

小技巧:移位赋值

i >>= 10;

将i右移10位后的值再赋给i。等价于:i = i >> 10;。

移位预处理

char、byte、shor类型进行移位操作时,先会自动转换为int类型再移位。由于int类型只有32位,所以,当出现移位:

i << 127;

时,int型的i当然不会左移127位,而只会左移32位(32 = 2^5,127 = 1111 1111)。所以,int类型移位的时候,移位数只有低5位有效。同理,long类型移位时,移位数只有低6位有效。


移位操作要注意的问题是高(低)位是补0还是补1和对char, byte, short型的操作:

(1)<< : (left-shift), 最低位补0

(2)>> : (signed right-shift), 右移过程使用符号位扩展(sign extension),即如果符号为为1则高位补1,  是0则补0,也就是逻辑右移

(3)>>> : (unsigned right-shit),右移过程使用零扩展(zero extension),即最高位一律补0,也就是算术右移

(4)移位操作的数据类型可以是byte, char, short, int, long型,但是对byte, char, short进行操作时会先把它们变成一个int型,最后得到一个int型的结果,对long型操作时得到一个long型结果,不可以对boolean型进行操作。

(5)移位操作符可以和=合并起来,即 <<= 、 >>= 和 >>>=。例如 a >>= 2; 表示将a右移两位后的值重新赋给a。当时在使用这三个操作符对 byte, char, short型数据进行操作时要注意,例如有一下代码片段:

public class ShiftTest

{

    public static void main(String [] args)

    {

        byte a;

        byte b;

        byte c;

        a = 127;

        b = 127;

        c = 127;

        a <<= 2;

        System.out.println(a);

        System.out.println(b <<= 2);

        System.out.println(c << 2);

    }

}

    

运行结果是:

            -4

            -4

             508

这说明了在操作a <<= 2 执行过程是这样的:先将 byte型的数 127变成int型,左移2位得到 508,然后把508赋给byte型变量a时只是简单地"折断"(truncate)得到数-4。编译时编译器不会提示你可能损失精度(实际上在本例中确实是损失精度了),但是如果你把a <<= 2改成 a = a << 2;编译器就会提示可能损失精度了。


无符号右移位操作符“>>>”在将bit串右移位时,从bit串的最左边填充0,这和带符号右移位操作符“>>”不同。“>>”在将bit串右移位时,从bit串的最左边填充原来最左边的位。也就是说,bit串原来最左边的位是符号位,如果为1,则在带符号右移时最左边始终填充1;如果为0,则在带符号右移时最左边始终填充0。
  移位操作符的例子见下表。

操作结果说明
00110010 << 211001000右边始终填充0
00110010 >> 200001100结果一样
00110010 >>> 200001100
10110010 >> 211101100结果不同
10110010 >>> 200101100

“按位与”操作符“&”对两个bit串按位进行逻辑与,“按位或”操作符“|”对两个bit串按位进行逻辑或,“按位异或”操作符“^”对两个bit串按位进行异或操作。运算规则如下表所示。

按位与按位或按位异或
0 & 0 = 00 | 0 = 00 ^ 0 = 0
0 & 1 = 00 | 1 = 10 ^ 1 = 1
1 & 0 = 01 | 0 = 11 ^ 0 = 1
1 & 1 = 11 | 1 = 11 ^ 1 = 0


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值