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