位运算在实际工作中的应用

最近一段时间的工作中,遇到了好几次位运算的实际使用场景,所以,写这篇文章来谈谈位运算在我们开发中常见的使用。

 1.只有两种状态的多个字段合并存储

  在做用户体系的时候,有这么一个场景:有5个问题需要用户回答:yes or no,后端需要存储用户每个问题的答案,后台业务系统再展示出来用户的回答。

  看到这个需求的第一反应,很简单啊,直接在表里面加5个字段,每个字段:0代表no,1代表yes,然后吭哧吭哧,很快啊,闪电五连鞭,做好了~

  后面转念一想,一下子加5个字段就做了这么点事,如果是10个问题呢?20个呢?总感觉有点浪费资源啊~

  然后,位运算闪亮登场!

  int长度32位,也就是:000......(32个0),二进制每一位都可以代表0或者1,就算有32个问题,照样可以用一个int类型的字段搞定!

  如果不够?那就用bigint,64位,一个字段支持63个问题!

  具体使用如下:

//每个字段左移位数
const (
    QuestionIndex1 = 0
    QuestionIndex2 = 1
    QuestionIndex3 = 2
    QuestionIndex4 = 3
    QuestionIndex5 = 4
)

//question1-5 位运算转入
        if Question1 == 1 {
            Question1To5 = Question1To5 | 1
        }
        if Question2 == 1 {
            Question1To5 = Question1To5 | (1 << QuestionIndex2)
        }
        if Question3 == 1 {
            Question1To5 = Question1To5 | (1 << QuestionIndex3)
        }
        if Question4 == 1 {
            Question1To5 = Question1To5 | (1 << QuestionIndex4)
        }
        if Question5 == 1 {
            Question1To5 = Question1To5 | (1 << QuestionIndex5)
        }

//question1-5 位运算转出
        Question1 = Question1To5 & 1
        Question2 = (Question1To5 & (1 << QuestionIndex2)) >> QuestionIndex2
        Question3 = (Question1To5 & (1 << QuestionIndex3)) >> QuestionIndex3
        Question4 = (Question1To5 & (1 << QuestionIndex4)) >> QuestionIndex4
        Question5 = (Question1To5 & (1 << QuestionIndex5)) >> QuestionIndex5   
View Code

 

 

  

  

  

  

posted @ 2022-08-25 14:32  蜗壳吃虾米  阅读(199)  评论(0)    收藏  举报