13.3.2 位运算符

位运算是基于内存中二进制数据的运算,也就是基于位的运算。常见的位运算有左移运算、右移运算、按位与、按位或、按位非、按位异或等运算。

位运算的左移、右移元素其实就是整数在内存中的“左右移动”,其中左移运算符为<<,右移运算符为>>。比如十进制整数4在内存中最后一个字节的排列如下:

13.3.2 位运算符 - 图1

如果对其进行左移2位的操作(左移后右边的空缺用0补足,下方粗体的0就是补足的部分),则在内存中变为十进制数16;相同的原理,如果对4做右移2位的操作,则值为1。

13.3.2 位运算符 - 图2


  1. #
  2. 左移右移运算
  3. #4
  4. 左移2
  5. [root@localhost ]# let "value=4<<2"
  6. [root@localhost ]# echo $value
  7. 16
  8. #4
  9. 右移2
  10. [root@localhost ]# let "value=4>>2"
  11. [root@localhost ]# echo $value
  12. 1

按位与运算(&),是将两个整数写成二进制的形式,然后同位置相比较,只有当对应的二进制值都为1时,结果才为1。以8&4来说,计算方式如下,计算结果为0。

13.3.2 位运算符 - 图3


  1. #
  2. 按位与运算
  3. [root@localhost ]# let "value=8&4"
  4. [root@localhost ]# echo $value
  5. 0

按位或运算(|),是将两个整数写成二进制的形式,然后同位置相比较,只要对应的位置有1,结果就为1。以8|4来说,其计算方式如下,计算结果为12。

13.3.2 位运算符 - 图4


  1. #
  2. 按位或运算
  3. [root@localhost ]# let "value=8|4"
  4. [root@localhost ]# echo $value
  5. 12

按位异或运算(^),是将两个整数写成二进制的形式,然后同位置相比较,只要对应的位置同为0或同为1,结果就为0,否则为1。以10^3来说,其计算方式如下,计算结果为9。

13.3.2 位运算符 - 图5


  1. #
  2. 按位异或运算
  3. [root@localhost ]# let "value=10^3"
  4. [root@localhost ]# echo $value
  5. 9

按位非(~)的计算方式比较麻烦,这里有个快捷的计算公式:“~a”的值为“-(a+1)”。


  1. #
  2. 按位非运算
  3. [root@localhost ~]# let "value=~8"
  4. [root@localhost ~]# echo $value
  5. -9