基础概念
- 与(&):两位同时为“1”,结果才为“1”,否则为0
十进制 | 二进制 |
---|---|
1 | 1 |
2 | 10 |
4 | 100 |
8 | 1000 |
16 | 10000 |
32 | 100000 |
64 | 1000000 |
128 | 10000000 |
256 | 100000000 |
0&0=0; 0&1=0; 1&0=0; 1&1=1;
eg.
(10) 1+2+8=11
(2) 1+10+1000=1011
相等:
(10) 11&2=2
(2) 1011&0010=0010
相等:
(10) 11&(2+8)=(2+8)
(2) 1011&1010=1010
不相等(因为11中不包含4):
(10) 11&(2+4)=2
(2) 1011&0110=0010
特性1:
11只能被拆分成1,2,8这三个2次幂数相加
特性2:
三个2次幂数(1,2,8)相加,如果(1+2+8)&他所包含的数=他所包含的数
在数据库设计中的最佳实践
- 根据特性1,我们可以一个字段里保存多个关联信息,使用时可拆出来,优于字符串"1,2,8"的方式,只需要存11,减少了存储空间,且可以用特性2的实践
- 根据特性2,我们可以查询字段是否包含任意组合的几种类型的数据
实例
设备信息表->可以设置多个标签(1,2,4,8,16,32),例如设备01设置了2,8两个标签
1. 如果要设置设备有1和4的标签,tag字段存储(1+4)
2. 如果要查询有2标签的所有设备,select * from device where tag & 2 = 2
3. 如果要查同时有2,16标签的所有设备,select * from device where tag & (2+16) = (2+16)
可替代方案
这种方式也可用素数之积取余=0来替代,不过乘积会有比较明显长度限制,不建议使用
网友评论