位运算符直接对整数在内存中的二进制表示(补码形式)进行操作,是最高效的运算方式之一。MySQL 支持 6 种位运算符,适用于权限系统、标志位处理等场景。
一、位运算符概览
运算符 | 名称 | 描述 | 示例 | 结果(十进制) |
---|---|---|---|---|
| | 位或 | 任一对应位为1则结果为1 | 5 | 3 | 7 |
& | 位与 | 两对应位都为1则结果为1 | 5 & 3 | 1 |
^ | 位异或 | 对应位不同则结果为1 | 5 ^ 3 | 6 |
~ | 位取反 | 所有位取反(0变1,1变0) | ~5 | -6 |
<< | 位左移 | 所有位向左移动指定位数 | 5 << 1 | 10 |
>> | 位右移 | 所有位向右移动指定位数 | 5 >> 1 | 2 |
二、详细运算符解析
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. 性能考虑:
位运算通常比其他运算更快
适合处理密集的布尔标志组合
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程