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