位运算符

位运算符除“ 按位与”和“按位或”运算符外,其他只能用于处理整数的操作数。位运算是完全针对位方面的操作。整型数据在内存中以二进制的形式表示,如int型变量7的二进制表示是00000000 00000000 00000000 00000111。
左边最高位是符号位,最高位是0表示正数,若为1则表示负数。负数采用补码表示,如-8的二进制表示为11111111 11111111 11111111 11111000。这样就可以对整型数据进行按位运算。

1.“按位与”运算

“按位与”运算的运算符为“&”,为双目运算符。“按位与”运算的运算法则是:如果两个整型数据a、b对应位都是1,则结果位才是1,否则为0。如果两个操作数的精度不同,则结果的精度与精度高的操作数相同,如图所示。

5&-4运算过程
5&-4运算过程

2.“按位或”运算

“按位或”运算的运算符为“|”,为双目运算符。“按位或”运算的运算法则是:如果两个操作数对应位都是0,则结果位才是0,否则为1。如果两个操作数的精度不同,则结果的精度与精度高的操作数相同,如图所示。

3|6的运算过程
3|6的运算过程

3.“按位取反”运算

“按位取反”运算也称“按位非”运算,运算符为“~”,为单目运算符。“按位取反”就是将操作数二进制中的1修改为0,0修改为1,如图所示。

~7运算
~7运算

4.“按位异或”运算

“按位异或”运算的运算符是“^”,为双目运算符。“按位异或”运算的运算法则是:当两个操作数的二进制表示相同(同时为0或同时为1)时,结果为0,否则为1若两个操作数的精度不同,则结果数的精度与精度高的操作数相同,如图所示。

10^3运算
10^3运算

5.移位操作

除了上述运算符之外,还可以对数据按二进制位进行移位操作。Java中的移位运算符有以下3种。

  1. <<:左移
  2. >>:右移
  3. >>>:无符号右移

左移就是将运算符左边的操作数的二进制数据按照运算符右边操作数指定的位数向左移动,右边移空的部分补0。右移则复杂一些。当使用“>>”符号时,如果最高位是0,右移空的位就填入0;如果最高位是1,右移空的位就填入1,如图所示。

Java还提供了无符号右移“>>>”,无论最高位是0还是1,左侧被移空的高位都填入0。

注意:移位运算符适用的数据类型有byte、short、char、int和long。

技巧:移位可以实现整数除以或乘以2ⁿ的效果。例如,y<<2与y*4的结果相同;y>>1的结果与y/2的结果相同。总之,一个数左移n位,就是将这个数乘以2”;一个数右移n位,就是将这个数除以2ⁿ。

发表评论