位运算是直接对二进制进行运算的。
<< 左移 3<<2 –> 3*2*2 像左移动两位。实则*2*2
3: 0000 0011
左移两位 0000 1100
>> 右移 3>>2 –> 3/2/2 实则/2/2
3: 0000 0011
右移两位 0000 0000
有符号的右移时候,最高位是0的用0补,最高位是1的用1补。
-3 >> 2
-3 1000 0000 0000 0000 0000 0000 0000 0011 原码 1111 1111 1111 1111 1111 1111 1111 1100反码 1111 1111 1111 1111 1111 1111 1111 1101 补码
右移两位 11 1111 1111 1111 1111 1111 1111 1111 11 (01丢失)补码 1111 1111 1111 1111 1111 1111 1111 1111 1110 反码 1000 0000 0000 0000 0000 0000 0000 0001 结果为-1
>>> 无符号的右移运算
-3 >>> 2
-3 1000 0000 0000 0000 0000 0000 0000 0011 原码 1111 1111 1111 1111 1111 1111 1111 1100 反码 1111 1111 1111 1111 1111 1111 1111 1101 补码
右移两位 00 1111 1111 1111 1111 1111 1111 1111 11 (01丢失)结果为1073741823
注意在java中 整数默认用int存储 所以是4字节。
&与运算 二进制码的与运算
|或运算、 二进制码的或运算
^异或运算 二进制码的异或运算
~反码
12&5
12的原码(高位为0不写)
12 0000 1100
5 0000 0101
& 0000 0100
结果 4
12|5
12 0000 1100
5 0000 0101
| 0000 1101
结果 13
12^5
12 0000 1100
5 0000 0101
^ 0000 1001
结果 9
~12
12 0000 0000 0000 0000 0000 0000 0000 1100
~ 1111 1111 1111 1111 1111 1111 1111 0011 (符号位改变 负数补码)
1111 1111 1111 1111 1111 1111 1111 0010 (反码)
1000 0000 0000 0000 0000 0000 0000 1101 (原码)
结果:-13
int m =5;
int n = 3
m = m^n;
n = m^n;
m = m^n;
m = m^n
n = m ^ n = (m ^ n) ^n = m =5
m = m ^n = (m ^ n) ^n = n = 3
5 0000 0101
3 0000 0011
^ 0000 0110 6
3 0000 0011
^ 0000 0101 5