java中的移位操作

一、左移 <<

向左移动,高位丢弃,低位用0补齐
不溢出的情况下num<<1相当于num*2
例如

        int i = Integer.MIN_VALUE;
        System.out.println(Integer.toBinaryString(i));
        // 10000000000000000000000000000000
        System.out.println(Integer.toBinaryString(i << 1));
        // 0

二、右移

1、有符号右移 >>

向右移动,高位用符号位补齐,低位丢弃
不溢出的情况下num>>1相当于num/2

        int i = Integer.MIN_VALUE;
        System.out.println(Integer.toBinaryString(i));
        // 10000000000000000000000000000000
        System.out.println(Integer.toBinaryString(i >> 1));
        // 11000000000000000000000000000000

任何一个负数,如果一直右移下去,最终都会得到 -1

        System.out.println(Integer.toBinaryString(i >> 31)); //(i < 0)
        // 11111111111111111111111111111111(-1)
2、无符号右移>>>

向右移动,高位用0补齐,低位丢弃

        int i = -3;
        System.out.println(Integer.toBinaryString(i));
        // 11111111111111111111111111111101
        System.out.println(Integer.toBinaryString(i >>> 1));
        // 1111111111111111111111111111110(第一位的0没有显示)
        System.out.println(i >>> 1);
        // 2147483646

任何一个数,如果一直无符号右移下去,最终都会得到0

        System.out.println(i >>> 31 >>> 1);

三、补充

当移位的位数大于或等于数据类型的表示位数时,会先对移位的位数取模
举个例子:对于int,其表示位数时32位,如果我们要对一个int型的整数num做移位操作,
移动位数为33,那么,计算时会先将33对32取模得到1,然后对num进行1位的移位操作。
如果移动位数是32,那么,不做操作
这也是我上面最后一行代码对i的移位分两次

System.out.println(i >>> 31 >>> 1)System.out.println(i >>> 32)的结果是不一样的

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值