位运算符用于处理整形和字符型的操作数。位运算是完全针对二进制位(bit)单位的操作。Java语言提供的位运算符如表1所示。
表1 逻辑运算符
运算符 |
用法 |
含义 |
运算分类 |
~ 非 |
~op1 |
对op1操作数按位取反 |
按位运算 |
& 与 |
op1 & op2 |
op1和op2按位相与 |
|
| 或 |
op1 | op2 |
op1和op2按位相或 |
|
^ 异或 |
op1 ^ op2 |
op1和op2按位异或 |
|
<< 左移位 |
op1 << op2 |
op1按位左移op2次 |
移位运算符 |
>> 右移位 |
op1 >> op2 |
op2按位右移op2次 |
|
>>> 无符号右移位 |
op1 >>> op2 |
op2不带符号按位右移op2次 |
说明:Java的位运算符中,“~”非运算是一元运算符,除此之外的都是二元运算符。
1.“按位与”运算
“按位与”运算的运算符为“&”,&是二元运算符。“按位与”运算的运算法则是:如果两个整型数据a、b对应位都是1,则该位结果才是1,否则为0。即
0&0=0 0&1=0 1&0=0 1&1=1
例如:153的二进制是10011001,46的二进制是00101110,这两个数按位与运算的方法如下,括号中的是十进制数。
10011001(153)
& 00101110(46)
---------------------------------
00001000(8)
2.“按位或”运算
“按位或”运算的运算符为“|”,它是二元运算符。“按位或”运算的运算法则是:如果两个操作数对应位都是0,则该位的结果才是0,否则为1。即
0|0=0 0|1=1 1|0=1 1|1=1
例如:153的二进制是10011001,46的二进制是00101110,这两个数按位进行或运算的方法如下,括号中的是十进制数。
10011001(153)
| 00101110(46)
---------------------------------
10111111 (191)
3.“按位取反”运算
“按位取反”运算也称“按位非”运算,运算符为“~”,~为一元运算符。它的运算法则是操作数二进制中的1修改为0,0修改为1。即
~0=1 ~1=0
例如:153的二进制是10011001,把它按位取反的结果为01100110
4.“按位异或”运算
“按位异或”运算的运算符位“^”,^为二元运算符。“按位异或”运算的运算法则是:当两个操作数的二进制对应位相同(同时为0或同时为1)时,结果为0,否则为1。即
0^0=0 0^1=1 1^0=1 1^1=0
例如:153的二进制是10011001,46的二进制是00101110,这两个数按位进行异或运算的方法如下,括号中的是十进制数。
10011001(153)
^ 00101110(46)
---------------------------------
10110111(183)
5.位移运算
除了上述按位运算符之外,还可以对数据按二进制位进行移位操作,Java中的移位运算符有三种:
q << 左移
q >> 右移
q >>> 无符号右移
左移就是将左边的操作数在内存中的二进制数据左移右边操作数指定的位数,左边移空的部分补0。右移则复杂一些。当使用“>>”符号时,如果最高位是0,左移空的位就填入0;如果最高位是1,右移空的位就填入1。如图1所示。
图1 右移
Java还提供了无符号右移“>>>”,不管最高位是0还是1,左移空的高位都添入0。
注意:移位运算符适用的数据类型有byte、short、char、int、long。
技巧:移位能让我们实现整数除以或乘以2的n次方的效果,如:y<<2于y*4的结果相同;y>>1的结果于y/2的结果相同。总之,一个数左移n位,就是将这个数乘以2的n次方,一个数右移n位,就是将这个数除以2的n次方。