Java支持7种位运算符:
&:按位与
| :按位或
~ :按位非
^ :按位异或
<<:左位移
>>:右位移
>>>:无符号右位移
& 与 :二进制中都为1即为1
5&9 =1
00000101 –5
00001001 –9
00000001 –1
| 或 :二进制中有一个为1即为1
5|9 = 13
00000101 –5
00001001 –9
00001101 –13
~ 非 :二进制取反,如果符号位为负,即需要转换为原码读出(扩展:负数存储方式)
~ 5
00000000 00000000 00000000 000000101 –5
~
11111111 11111111 11111111 111111010 – ~5(负数)
-1
11111111 11111111 11111111 111111001
(除符号位之外) 取反
10000000 00000000 00000000 000000110 – -6
^ 异或:不同则取1
5 ^ 9:
00000000 00000000 00000000 00000101 – 5
00000000 00000000 00000000 00001001 – 9
00000000 00000000 00000000 00001100 – 12
5^9=12
<< 左移
5 << 2
00000000 00000000 00000000 00000101 – 5
00000000 00000000 00000000 00010100 –20
按位左移动2位,右边空出来补0。
应用:a左移动x位,即会变成:a=a*2^x – 20=5*2^2;
>>:右位移
带符号位补充:
20 >> 2
00000000 00000000 00000000 00010100 – 20
00 00000000 00000000 00000000 00010100 – 5
右移,左边补充符号位,如果是负数补 1, 是正数补 0
>>>:无符号右位移
-5 >>> 2
11111111 11111111 11111111 11111011 – -5
00111111 11111111 11111111 11111110 – 2^30-2
无论符号位是正是负,都补 0,所以无符号右移,得到的都是正数!
扩展:负数的存储形式
int -1 :最高位默认符号位,0为正,1为负。
10000000 00000000 00000000 00000001 –原码
取反 (符号位不变)
11111111 11111111 11111111 11111110 –反码
加1
11111111 11111111 11111111 11111111 –补码
因为计算机只能存储2进制,如果直接以带符号原码形 式存储 -1。那么计算-1+2时,会得到:
10000000 00000000 00000000 00000001 – -1
00000000 00000000 00000000 00000010 – 2
10000000 00000000 00000000 00000011 – -3
得到-3 ,显然不合适。
扩展:扩展的赋值运算符
+=
-=
*=
/=
%=
&=
|=
^=
<<=
>>=
>>>=
在可以使用扩展运算符的时候尽量使用扩展运算符,会使得程序更加健壮!