省略号部分都是 0,101 前面总共有 61 个 0。
注意:为了方便大家阅读,本节在介绍正数的补码时,省略了前面的 0。
MySQL 支持 6 种位运算符,如下表所示。
运算符 | 说明 | 使用形式 | 举例 |
---|---|---|---|
| | 位或 | a | b | 5 | 8 |
& | 位与 | a & b | 5 & 8 |
^ | 位异或 | a ^ b | 5 ^ 8 |
~ | 位取反 | ~a | ~5 |
<< | 位左移 | a << b | 5 << 2,表示整数 5 按位左移 2 位 |
>> | 位右移 | a >> b | 5 >> 2,表示整数 5 按位右移 2 位 |
位运算中的&
、|
、~
和逻辑运算中的&&
、||
、!
非常相似。
位或运算符 |
参与|
运算的两个二进制位有一个为 1 时,结果就为 1,两个都为 0 时结果才为 0。例如1|1
结果为 1,0|0
结果为0,1|0
结果为1,这和逻辑运算中的||
非常类似。
例 1
使用位或运算符进行正数运算,SQL 语句如下:
mysql> SELECT 10|15,9|4|2; +-------+-------+ | 10|15 | 9|4|2 | +-------+-------+ | 15 | 15 | +-------+-------+ 1 row in set (0.00 sec)
10 的补码为 1010,15 的补码为 1111,按位或运算之后,结果为 1111,即整数 15;9 的补码为 1001,4 的补码为 0100,2 的补码为 0010,按位或运算之后,结果为 111,即整数 15。
例 2
使用位或运算符进行负数运算,SQL 语句如下:
mysql> SELECT -7|-1; +----------------------+ | -7|-1 | +----------------------+ | 18446744073709551615 | +----------------------+ 1 row in set (0.00 sec)
-7 的补码为 60 个‘1’加 1001,-1 的补码为 64 个‘1’,按位或运算之后,结果为 64 个‘1’,即整数 18446744073709551615。
可以发现,任何数和 -1 进行位或运算时,最终结果都是 -1 的十进制数。