一 概述
Java中运算符的优先级和结合性表
二 移位运算符
1.按位有符号左移(<<)
//按位有符号左移(<<)
/*
* 00001000 8 (8对应的二进制数)
* 00100000 32 (8左移动2位后的二进制数)
* */
int a = 8<<2;
System.out.println("8以有符号的方式左移两位:"+a);
/*
* 10001000 -8 (-8的二进制)
* 11110111 -8的反码
* 11111000 -8的补码
* 11100000 整体左移两位后,高位溢出的部分舍去
* 11011111 再-1得反码
* 10100000 按位取反,最高位为符号位,结果为-32
* */
int b = -8<<2;
System.out.println("-8以有符号的方式左移两位:"+b);
执行后的结果:
8以有符号的方式左移两位:32
-8以有符号的方式左移两位:-32
2. 按位有符号右移(>>)
//按位有符号右移(>>)
/*
* 00001000 8 (8对应的二进制数)
* 00000010 2 (8右移动2位后的二进制数)
* */
int c = 8>>2;
System.out.println("8以有符号的方式右移两位:"+c);
//右移后负数位用1填充
/*
* 10001000 -8 (-8的二进制)
* 11110111 -8的反码
* 11111000 -8的补码
* 11111110 整体右移两位后
* 11111101 再-1得反码
* 10000010 按位取反,最高位为符号位,结果为-2
* */
int d = -8>>2;
System.out.println("-8以有符号的方式右移两位:"+d);
执行后的结果:
8以有符号的方式右移两位:2
-8以有符号的方式右移两位:-2
3. 按位无符号右移 (>>>)
//按位无符号右移(>>>)
/*
* 正数和有符号右移一样,负数的无符号右移动,就是相应的补码移位所得,高位补0即可
* */
int e = 8>>>2;
System.out.println("8以无符号的方式右移两位:"+e);
/*
* 10000000 00000000 00000000 00001000 -8(32位无符号的-8)
* 11111111 11111111 11111111 11110111 -8的反码
* 11111111 11111111 11111111 11111000 -8的补码
* 00111111 11111111 11111111 11111000 无符号右移两位,不取原码,直接输出
* */
int f = -8>>>2;
System.out.println("-8以无符号的方式右移两位:"+f);
执行后的结果:
8以无符号的方式右移两位:2
-8以无符号的方式右移两位:1073741822