Mysql教程

12.5位运算符

位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,然后进行位运算,最后再将计算结果从二进制数变回十进制数。在MySQL中支持6种位运 算符。这6种位运算符分别是按位与、按位或、按位取反、按位异或、按位左移和按位右 移。下面是4种逻辑运算符的符号、名称,如表12.4所示。

符号 名称 符号 名称
& 按位与 ^ 按位异或
| 按位或 << 按位左移
~ 按位取反 >> 按位右移

1. 按位与

“&”表示按位与。进行该运算时,数据库系统会先将十进制的数转换为二进制的数。 然后对应操作数的每个二进制位上进行与运算。1和1相与得1,与0相与得0。运算完成 后再将二进制数变回十进制数。

<p【示例12-23】下面是使用“&”的例子。< p="">

mysql> SELECT5&6, 5&6&7;
+-----+-------+
| 5&6 | 5&6&7 |
|  4  |   4   |
+-----+-------+
1 row in set (0.00 sec)

5的二进制数为101, 6的二进制数为110。两个二进制数的对应位上进行与运算,得到的结果为100。然后将二进制数100转换十进制数,结果即为4。在“5&6&7”中,先将“5&6”进行计算,得到结果为4。然后再将4与7进行按位与。7的二进制数为111。 按位与的结果为110。转换为十进制就是4。

2.按位或

“|”表示按位或。将操作数化为二进制数后,每位都进行或运算。1和任何数进行或运算的结果都是1,0与0或运算结果为0。

【示例12-24】下面是使用“|”的例子。

mysql> SELECT 5|6, 5|6|7;
+-----+-------+
| 5|6 | 5|6|7 |
+-----+-------+
|  7  |   7   |
+-----+-------+
1 row in set (0.00 sec)

5的二进制数是101, 6的二进制数是110。两个二进制数的对应位上进行或运算,得 到的结果为111。然后将二进制数111转换十进制数,结果就是7了。“516|7”中,先将“5丨6” 进行计算,得到的结果为4。然后再将4与7进行按位或。7的二进制数为111。按位与的 结果为111。转换为十进制即为7。

3.按位取反

“~”表示按位取反。将操作数化为二进制数后,每位都进行取反运算。1取反后变成 0,0取反后变成1。

【示例12-25】下面是使用“~”的例子。

mysql>SELECT ~1;
+----------------------+
| 18446744073709551614 |
+----------------------+
1 row in set (0.00 sec)

对数字1进行按位取反后,结果变成了18446744073709551614。因为在MySQL中常量是8个字节,每个字节是8位,那么一个常量就是64位。数字1变成二进制数以后,是由64位构成的,最后一位是1,前面的63位是0。进行按位取反后,前63位的值是1, 最后一位是0。这个二进制数最后转换为十进制数就是18446744073709551614。使用BIN() 函数可以查看二进制数。下面使用BIN()函数来查看常数1取反结果的二进制数,结果显示如下:

mysql>SELECT BIN(~1);
+----------------------------------------------------------------+
|1111111111111111111111111111111111111111111111111111111111111110|
+----------------------------------------------------------------+
1 row in set (0.00 sec)

4.按位异或

“^’表示按位异或。将操作数化为二进制数后,每位都进行异或运算。相同的数异或之后结果是0,不同的数异或之后结果为1.

【示例12-26】下面是使用"^"的例子。

mysql>SELECT 5^6;
+-----+
| 5^6 |
+-----+
|  3  |
+-----+
1 row in set (0.00 sec)

5的二进制数是101, 6的二进制数是110。按位异或之后结果为011。转换为十进制数就是3。

5.按位左移与按位右移

“<<”表示按位左移。“m< >”表示按位右移。“m>>n”表示m的二进制数向右移。位,左边补上0个0。二进制数011右移1位后变成001,最后一个1被移出去了,直接就不要了。

【示例12-27】下面是使用“<<”和“>>”的例子。

mysql>5<<2,5>>2;
+------+------+
| 5<<2 | 5>>2 |
+------+------+
|   20 |   1  |
1 row in set (0.00 sec)

5的二进制数为101,左移两位后变为10100。这个数转换为十进制数即为20。101右 移两位后变为001,这个数转换为二进制数即为1。

注意:位运算都是在二进制数上进行的。用户输入的操作数可能是十进制数,数据库系 统在进行位运算之前会将其转换为二进制数。等位运算完成后,再将这些数字转 换回十进制数。而且,位运算都是对应位上运算,如数1的第一位只与数2的第 一位进行运算,数1的第二位只与数2的第二位进行运算。


关注微信获取最新动态