位运算符直接对整数在内存中的二进制表示(补码形式)进行操作,是最高效的运算方式之一。MySQL 支持 6 种位运算符,适用于权限系统、标志位处理等场景。

 

一、位运算符概览

运算符名称描述示例结果(十进制)
|位或任一对应位为1则结果为15 | 37
&位与两对应位都为1则结果为15 & 31
^位异或对应位不同则结果为15 ^ 36
~位取反所有位取反(0变1,1变0)~5-6
<<位左移所有位向左移动指定位数5 << 110
>>位右移所有位向右移动指定位数5 >> 12


二、详细运算符解析

1. 位或运算符(|)

规则:对应位有一个为1则结果为1

正数示例

SELECT 10|15, 9|4|2; --结果: 15, 15


负数示例

SELECT -7|-1; --结果: 18446744073709551615(64位全1)


计算过程:

  10: 1010

 15: 1111

      1111 (15)

 

2. 位与运算符(&)

规则:对应位都为1则结果为1

正数示例

SELECT 10 & 15, 9 & 4 & 2; --结果: 10, 0

 负数示例

SELECT -7 & -1; --结果: -7(保持原值)


计算过程:

  10: 1010

& 15: 1111

      1010 (10)

3. 位异或运算符(^)

规则:对应位不同则结果为1

正数示例

SELECT 10^15, 1^0, 1^1; --结果: 5, 1, 0


负数示例

SELECT -7^-1; --结果: 6


计算过程:

  10: 1010

^ 15: 1111

      0101 (5)

 

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

规则:所有位左移,低位补0

 正数示例

SELECT 1<<2, 4<<2; --结果: 4, 16


 负数示例

SELECT -7<<2; --结果: 18446744073709551588


计算过程:

1 (0001) << 2 = 0100 (4)

相当于乘以4

 

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

规则:所有位右移,高位补0

 正数示例

SELECT 1>>1, 16>>2; --结果: 0, 4


 负数示例

SELECT -7>>2; --结果: 4611686018427387902


计算过程:

16 (10000) >> 2 = 00100 (4)

相当于除以4

 

6. 位取反运算符(~)

规则:所有位取反(包括符号位)

SELECT ~1, ~18446744073709551614; --结果: 极大数, 1
SELECT BIN(~1); --查看二进制表示


计算过程:

1 (000...0001)

取反后: 111...1110

 

三、复合位运算示例

组合运算(注意优先级)

SELECT 5 & ~1; --结果: 4


权限检查示例

SELECT * FROM users WHERE permissions & 4 = 4; --检查读权限


 标志位设置

UPDATE products SET flags = flags | 2 WHERE id = 10; --设置第2个标志位

四、位运算的特殊性质

1. 与-1运算:

    `x | -1` = -1

    `x & -1` = x

2. 位移性质:

    左移1位 ≈ 乘以2

    右移1位 ≈ 除以2(向下取整)

3. 异或特性:

   `x ^ x` = 0

    `x ^ 0` = x

 

五、实际应用场景

1.权限系统:

   定义权限常量

SET @READ = 1, @WRITE = 2, @EXECUTE = 4;


    检查读写权限

SELECT * FROM files WHERE permissions & (@READ | @WRITE) = (@READ | @WRITE);


2.高效存储标志位:

    使用一个INT列存储多个布尔标志

ALTER TABLE products ADD flags INT DEFAULT 0;


    设置特价标志(第3位)

 UPDATE products SET flags = flags | 4 WHERE discount = 1


3.颜色值处理:

    提取RGB分量

  

SELECT 
     (color >> 16) & 255 AS red,
     (color >> 8) & 255 AS green,
     color & 255 AS blue
   FROM images;


六、注意事项

1. MySQL整数类型:

    默认使用64位(BIGINT)存储整数常量

    对较小整数运算时会自动扩展

2. 负数处理:

    位运算操作的是补码形式

    右移负数时高位补1(算术右移)

3. 性能考虑:

    位运算通常比其他运算更快

    适合处理密集的布尔标志组合

点赞(1)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)