首页 > 编程笔记

MySQL位运算符详解

位运算符是在二进制数上进行计算的运算符,它先将操作数变成二进制数,然后进行位运算,最后将计算结果从二进制变回十进制数。

MySQL 中提供的位运算符有按位或(|)、按位与(&)、按位异或(^)、按位左移(<<)、按位右移(>>)和按位取反(~),如下表所示。

表 1 MySQL中的位运算符
运算符 作用
| 位或
& 位与
^ 位异或
<< 位左移
>> 位右移
~ 位取反,反转所有比特位
接下来,分别讨论不同的位运算符的使用方法。

1、位或运算符(|)

位或运算的实质是将参与运算的几个数据按照对应的二进制数逐位进行逻辑或运算,对应的二进制位有一个或两个为 1,则该位的运算结果为 1,否则为 0。

【实例】使用位或运算符进行运算,SQL 语句如下:
mysql> SELECT 10 | 15, 9 | 4 | 2;
+---------+-----------+
| 10 | 15 | 9 | 4 | 2 |
+---------+-----------+
|     15  |      15   |
+---------+-----------+
10 的二进制数值为 1010,15 的二进制数值为 1111,按位或运算之后,结果为 1111,即整数 15。

9 的二进制数值为 1001,4 的二进制数值为 0100,2 的二进制数值为 0010,按位或运算之后,结果为 1111,即整数 15。其结果为一个 64 位无符号整数。

2、位与运算符(&)

位与运算的实质是将参与运算的几个操作数按照对应的二进制数逐位进行逻辑与运算,对应的二进制位都为 1,则该位的运算结果为 1,否则为 0。

【实例】使用位与运算符进行运算,SQL 语句如下:
mysql> SELECT 10 & 15, 9 &4& 2;
+---------+---------+
| 10 & 15 | 9 &4& 2 |
+---------+---------+
|     10  |     0   |
+---------+---------+
10 的二进制数值为 1010,15 的二进制数值为 1111,按位与运算之后,结果为 1010,即整数 10。

9 的二进制数值为 1001,4 的二进制数值为 0100,2 的二进制数值为 0010,按位与运算之后,结果为 0000,即整数 0。其结果为一个 64 位无符号整数。

3、位异或运算符(^)

位异或运算的实质是将参与运算的两个数据按照对应的二进制数逐位进行逻辑异或运算,对应位的二进制数不同时,对应位的结果为 1;如果两个对应位数都为 0 或者都为 1,则对应位的结果为 0。

【实例】使用位异或运算符进行运算,SQL 语句如下:
mysql> SELECT 10 ^ 15, 1 ^0, 1 ^ 1;
+---------+------+-------+
| 10 ^ 15 | 1 ^0 | 1 ^ 1 |
+---------+------+-------+
|     5   |  1   |     0 |
+---------+------+-------+
10 的二进制数值为 1010,15 的二进制数值为 1111,按位异或运算之后,结果为 0101,即整数 5。

1 的二进制数值为 0001,0 的二进制数值为 0000,按位异或运算之后,结果为 0001;1 和 1 本身二进制位完全相同,因此结果为 0。

4、位左移运算符(<<)

位左移运算符 << 使指定的二进制值的所有位都左移指定的位数。左移指定位数之后,左边高位的数值将被移出并丢弃,右边低位空出的位置用 0 补齐。

位左移运算符(<<)的语法格式为:

expr<<n

其中,n 指定值 expr 要移位的位数。

【实例】使用位左移运算符进行运算,SQL 语句如下:
mysql> SELECT 1<<2, 4<<2;
+------+------+
| 1<<2 | 4<<2 |
+------+------+
|   4  |  16  |
+------+------+
1 的二进制值为 0000 0001,左移两位之后变成 0000 0100,即十进制整数 4。

十进制 4 左移两位之后变成 0001 0000,即变成十进制的 16。

5、位右移运算符(>>)

位右移运算符 >> 使指定的二进制值的所有位都右移指定的位数。右移指定位数之后,右边低位的数值将被移出并丢弃,左边高位空出的位置用 0 补齐。

位右移运算符(>>)的语法格式为:

expr>>n

其中,n 指定值 expr 要移位的位数。

【实例】使用位右移运算符进行运算,SQL 语句如下:
mysql> SELECT 1>>1, 16>>2;
+------+-------+
| 1>>1 | 16>>2 |
+------+-------+
|   0  |    4  |
+------+-------+
1 的二进制值为 0000 0001,右移 1 位之后变成 0000 0000,即十进制整数 0。

16 的二进制值为 0001 0000,右移两位之后变成 0000 0100,即变成十进制的 4。

6、位取反运算符(~)

位取反运算的实质是将参与运算的数据按照对应的二进制数逐位反转,即 1 取反后变为 0、0 取反后变为 1。

【实例】使用位取反运算符进行运算,SQL语句如下:
mysql> SELECT 5 & ~1;
+--------+
| 5 & ~1 |
+--------+
|    4   |
+--------+
在逻辑运算 5&~1 中,由于位取反运算符“~”的级别高于位与运算符“&”,因此先对 1 进行取反操作,取反之后,除了最低位为 0 外其他位都为 1,即 1110,然后与十进制数值 5 进行与运算,结果为 0100,即整数 4。

提示,MySQL 经过位运算之后的数值是一个 64 位的无符号整数,1 的二进制数值表示为最右边位为 1、其他位均为 0,取反操作之后,除了最低位为 0 外,其他位均变为 1。

可以使用 BIN() 函数查看 1 取反之后的结果,SQL 语句如下:
mysql> SELECT BIN(~1);
+------------------------------------------------------------------+
| BIN(~1)                                                 |
+------------------------------------------------------------------+
| 1111111111111111111111111111111111111111111111111111111111111110 |
+------------------------------------------------------------------+

推荐阅读