树叶云数据库教程:MySQL位运算符

所谓位运算,就是按照内存中的比特位(Bit)进行操作,这是计算机能够支持的最小单位的运算。程序中所有的数据在内存中都是以二进制形式存储的,位运算就是对这些二进制数据进行操作。

位运算一般用于操作整数,对整数进行位运算才有实际的意义。整数在内存中是以补码形式存储的,正数的补码形式和原码形式相同,而负数的补码形式和它的原码形式是不一样的,这一点大家要特别注意;这意味着,对负数进行位运算时,操作的是它的补码,而不是它的原码。

对整数存储不了解的读者请猛击《整数在内存中是如何存储的,为什么它堪称天才般的设计》。

MySQL 中的整数字面量(常量整数,也就是直接书写出来的整数)默认以 8 个字节(Byte)来表示,也就是 64 位(Bit)。例如,5 的二进制形式为:

0000 0000 … 0000 0101

省略号部分都是 0,101 前面总共有 61 个 0。

注意:为了方便大家阅读,本节在介绍正数的补码时,省略了前面的 0。

 

MySQL 支持 6 种位运算符,如下表所示。

MySQL 中的位运算符

运算符 说明 使用形式 举例
| 位或 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 的十进制数

位与运算符 &

参与
&运算的两个二进制位都为 1 时,结果就为 1,否则为 0。例如
1|1结果为 1,
0|0结果为 0,
1|0结果为 0,这和逻辑运算中的
&&非常类似。

例 3

使用位与运算符进行正数运算,SQL 语句如下:

mysql> SELECT 10 & 15,9 & 4 & 2;
+---------+-----------+
| 10 & 15 | 9 & 4 & 2 |
+---------+-----------+
|      10 |         0 |
+---------+-----------+
1 row in set (0.00 sec) 

10 的补码为 1010,15 的补码为 1111,按位与运算之后,结果为 1010,即整数 10;9 的补码为 1001,4 的补码为 0100,2 的补码为 0010,按位与运算之后,结果为 0000,即整数 0。

例 4 

使用位与运算符进行负数运算,SQL 语句如下:

mysql> SELECT -7&-1;
+----------------------+
| -7&-1                |
+----------------------+
| 18446744073709551609 |
+----------------------+
1 row in set (0.01 sec)

-7 的补码为 60 个‘1’加 1001,-1 的补码为 64 个‘1’,按位与运算之后,结果为 60 个‘1’加 1001,即整数 18446744073709551609。

可以发现,
任何数和 -1 进行位与运算时,最终结果都为任何数本身的十进制数

位异或运算符 ^

参与
^运算的两个二进制位不同时,结果为 1,相同时,结果为 0。例如
1|1结果为 0,
0|0结果为 0,
1|0结果为1。

例 5

使用位异或运算符进行正数运算,SQL 语句如下:

mysql> SELECT 10^15,1^0,1^1;
+-------+-----+-----+
| 10^15 | 1^0 | 1^1 |
+-------+-----+-----+
|     5 |   1 |   0 |
+-------+-----+-----+
1 row in set (0.00 sec) 

10 的补码为 1010,15 的补码为 111,按位异或运算之后,结果为 0101,即整数 5;1 的补码为 0001,0 的补码为 0000,按位异或运算之后,结果为 0001;1 和 1 本身二进制位完全相同,因此结果为 0。

例 6 

使用位异或运算符进行负数运算,SQL 语句如下:

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

-7 的补码为 60 个‘1’加 1001,-1 的补码为 64 个‘1’,按位异或运算之后,结果为 110,即整数 6。

位左移运算符 << 

位左移是按指定值的补码形式进行左移,左移指定位数之后,左边高位的数值被移出并丢弃,右边低位空出的位置用 0 补齐。

位左移的语法格式为:

expr << n

其中,n 指定值 expr 要移位的位数,n 必须为非负数。

例 7

使用位左移运算符进行正数计算,SQL 语句如下:

mysql> SELECT 1<<2,4<<2;
+------+------+
| 1<<2 | 4<<2 |
+------+------+
|    4 |   16 |
+------+------+
1 row in set (0.00 sec) 

1 的补码为 0000 0001,左移两位之后变成 0000 0100,即整数 4;4 的补码为 0000 0100,左移两位之后变成 0001 0000,即整数 16。

例 8

使用位左移运算符进行负数计算,SQL 语句如下:

mysql> SELECT -7<<2;
+----------------------+
| -7<<2                |
+----------------------+
| 18446744073709551588 |
+----------------------+
1 row in set (0.00 sec)

-7 的补码为 60 个‘1’加 1001,左移两位之后变成 56 个‘1’加 1110 0100,即整数 18446744073709551588。

位右移运算符 >>

位右移是按指定值的补码形式进行右移,右移指定位数之后,右边低位的数值被移出并丢弃,左边高位空出的位置用 0 补齐。

 

位右移语法格式为:

expr >> n

其中,n 指定值 expr 要移位的位数,n 必须为非负数。 

例 9

使用位右移运算符进行正数运算,SQL 语句如下:

mysql> SELECT 1>>1,16>>2;
+------+-------+
| 1>>1 | 16>>2 |
+------+-------+
|    0 |     4 |
+------+-------+
1 row in set (0.00 sec)

1 的补码为 0000 0001,右移 1 位之后变成 0000 0000,即整数 0;16 的补码为 0001 0000,右移两位之后变成 0000 0100,即整数 4。

例 10

使用位右移运算符进行负数运算,SQL 语句如下:

mysql> SELECT -7>>2;
+---------------------+
| -7>>2               |
+---------------------+
| 4611686018427387902 |
+---------------------+
1 row in set (0.00 sec)

-7 的补码为 60 个‘1’加 1001,右移两位之后变成 0011 加 56 个‘1’加 1110,即整数 4611686018427387902。

位取反运算符 ~ 

位取反是将参与运算的数据按对应的补码进行反转,也就是做 NOT 操作,即 1 取反后变 0,0 取反后变为 1。

例 11

下面看一个经典的取反例子,对 1 进行位取反运算,具体如下所示:

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

常量 1 的补码为 63 个‘0‘加 1 个’1‘,位取反后就是 63 个’1‘加一个’0‘,转换为二进制后就是 18446744073709551614。

 

可以使用 BIN() 函数查看 1 取反之后的结果,BIN() 函数的作用是将一个十进制数转换为二进制数,SQL 语句如下:

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

1 的补码表示为最右边位为 1,其他位均为 0,取反操作之后,除了最低位,其他位均变为 1。

例 12

使用位取反运算符进行运算,SQL 语句如下:

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

逻辑运算
5&~1 中,由于位取反运算符‘~’的级别高于位与运算符‘&’,因此先对 1 进行取反操作,结果为 63 个‘1’加一个‘0’,然后再与整数 5 进行与运算,结果为 0100,即整数 4。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/265870.html<

(0)
管理的头像管理
上一篇2025-05-05 16:54
下一篇 2025-05-05 16:56

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注