Java的位运算符“有按位与”、“按位或”、“按位取反”、“按位异或”、“移位”。
位运算符除“按位与”和“按位或”运算符外,其他只能用于处理整数的操作数。位运算是完全针对位方面的操作。整型数据在内存中以二进制的形式表示,如int型变量7的二进制表示是00000000 00000000 00000000 00000111。
左边最高位是符号位,最高位是0表示正数,若为1则表示负数。负数才用补码表示,如-8的二进制表示为11111111 11111111 11111111 11111000。这样就可以对整型数据进行按位运算。
1. “按位与”运算
“按位与”运算符为“&”,为双目运算符。“按位与”运算的运算法则是:如果两个整型数据a、b对应位都是1,则结果位才是1,否则为0。如果两个操作数的精度不同,则结果的精度与精度高的操作数相同,如下所示。
00000000 00000000 00000000 00000101 // 整数5的二进制表示
11111111 11111111 11111111 11111100 // 整数-4的二进制表示
00000000 00000000 00000000 00000000 // 5&-4的结果,十进制数为4
2. “按位或”运算
“按位或”运算的运算符为“|”,为双目运算符。“按位或”运算的运算法则是:如果两个操作数对应位都是0,则结果位才是0,否则是1。如果两个操作数的精度不同,则结果的精度与精度高的操作位相同,如下所示。
00000000 00000000 00000000 00000011 // 整数3的二进制表示
00000000 00000000 00000000 00000110 // 整数6的二进制表示
00000000 00000000 00000000 00000111 // 3|6的结果,十进制表示7
3. “按位取反”运算
“按位取反”运算也称“按位非”运算,运算符为“~”,为单目运算符。“按位取反”就是将操作数二进制中的1修改为0,0修改为1,如下所示。
00000000 00000000 00000000 00000111 // 整数7的二进制表示
11111111 11111111 11111111 11111000 // ~7的二进制表示,十进制为-8
4. “按位异或”运算
“按位异或”运算的运算符是“^”,为双目运算符。“按位异或”运算的运算法则是:当两个操作数的二进制表示相同(同时为0或同时为1)时,结果为0,否则为1。若两个操作数的精度不同,则结果数的精度与高精度的操作数相同,如下所示。
00000000 00000000 00000000 00001010 // 整数10的二进制表示
00000000 00000000 00000000 00000011 // 整数3的二进制表示
00000000 00000000 00000000 00001001 // 10^3的结果,十进制表示9
5. 移位操作
Java中的位移运算符有以下三种。
- <<:左移。左移就是将运算符左边的操作数的二进制数据按照运算符右边操作数指定的位数向左移动,右边移空的部分补0。
- >>:右移。右移复杂一些。当使用“>>”符号时,如果最高位是0,右移空的位就填入0;如果最高位是1,右移空的位就填入1,如下所示(右移2位)。
- >>>:无符号右移。无论最高位是0还是1,左侧被移空的高位都填入0。
其它
注意:位移运算符适用的数据类型有byte、short、char、int和long。
技巧:位移可以实现整数除以或者乘以2的n次方的效果。例如,y<<2与y*4的结果是相同的;y>>1的结果与y/2的结果是相同的。总之,一个数左移n位,就是将这个数乘以2的n次方;一个数右移n位,就是将这个数除以2的n次方。