### 位运算符

位运算符用于处理整形和字符型的操作数。位运算是完全针对二进制位（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次方。