Java移位运算有三种:左移(<<)、右移(>>)、带符号右移(>>>)。
移位运算操作对象为整型,当对byte、char、short类型数据操作时转成int类型(正数高位填充0,负数高位填充1)。
1.左移运算
i<<n表示i对应二进制数左移n位,其中,左边n个高位被丢弃,并用n个0填充右边低位。
例子:1<<2
1对应二进制:0000 0000 0000 0000 0000 0000 0000 0001
左移两位后: 0000 0000 0000 0000 0000 0000 0000 0100
结果:4
看下面代码
public static void main(String[] args) {
int i = 1;
System.out.println(i<<2);
System.out.println(i<<(2 + 32));
byte b = -2;
System.out.println(b<<31);
}
输出结果为
4
4
0
对于byte、char、short和int类型数据,左移n位时先算n除以32的余数m(m = n%32),再做i<<m;
对于long类型数据,32改为64;
关于byte b = -2
-2对应二进制:1111 1111 1111 1111 1111 1111 1111 1110 (31个"1" + 1个"0")
左移31位后: 0000 0000 0000 0000 0000 0000 0000 0000
结果:0
2.右移运算
i>>n表示i对应二进制数右移n位,其中,右边n个低位被丢弃,i为正数时用n个0填充左边高位,i为负数是用n个1填充左边高位。
例子:8>>2
8对应二进制:0000 0000 0000 0000 0000 0000 0000 1000
右移两位后: 0000 0000 0000 0000 0000 0000 0000 0010
结果:2
public static void main(String[] args) {
int i = 8;
System.out.println(8>>2);
System.out.println(i>>(2 + 32));
byte b = -8;
System.out.println(b>>2);
}
输出结果为
2
2
-2
-8对应二进制:1111 1111 1111 1111 1111 1111 1111 1000
右移2位后: 1111 1111 1111 1111 1111 1111 1111 1110
结果:-2
3.无符号右移运算
i>>>n表示i对应二进制数右移n位,其中,右边n个低位被丢弃,不管正负数左边n个高位由0填充。
例子:-8>>>2
-8对应二进制:1111 1111 1111 1111 1111 1111 1111 1000
右移2位后: 0011 1111 1111 1111 1111 1111 1111 1110
结果:1073741822
看下面代码
public static void main(String[] args) {
int i = 8;
System.out.println(8>>>2);
System.out.println(i>>>(2 + 32));
byte b = -8;
System.out.println(b>>2);
System.out.println(b>>>2);
}
输出结果为
2
2
-2
1073741822