记住所有的移动位数,针对的都是补码来讲的,所以要先将十进制整数转换成补码后,然后再来进行移位操作
移位操作 还要注意类型的约束条件,例如int,移动范围是0-31位,所以看补码只能看最后五位,这才是有效数字;long移动范围是0-63,所以补码只能看最后六位。
右移操作符。
左位移操作符(<<):无论是有符号数还是无符号数,都低位补0。
有符号右移位操作符(>>):用符号扩展,为正高位补0,为负高位补1。
无符号小技巧:移位赋值
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位有效。
实例:
public class Main {
public static void main(String[] args) {
System.out.println(1 << -2);
System.out.println(1 << 30);
System.out.println(1L << -2);
System.out.println(1L << 62);
}
}
1073741824
1073741824
4611686018427387904
4611686018427387904
int 是32位的,long 是64位的,移动负数位或者超过位数的应该取余数到 0~31, 0~63之间。