美文网首页
2的次幂数的位运算最佳实践

2的次幂数的位运算最佳实践

作者: Amitabha2 | 来源:发表于2020-07-27 14:47 被阅读0次

    基础概念

    • 与(&):两位同时为“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来替代,不过乘积会有比较明显长度限制,不建议使用

    相关文章

      网友评论

          本文标题:2的次幂数的位运算最佳实践

          本文链接:https://www.haomeiwen.com/subject/qduzlktx.html