文章目录

  • 一、左移 <<
  • 二、右移
  • 1、有符号右移 >>
  • 2、无符号右移>>>
  • 三、补充


一、左移 <<

向左移动,高位丢弃,低位用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)的结果是不一样的