最近在项目中遇到一个问题,就是我一个题目可以分为10种题型(每题的题型是固定的),后台要求上传这10种题型的对错,想想有什么好的办法呢
1、最差的就是让后台设置10个字段,给每个字段赋值,是否做对了,但是这个太恶心了,如果后加到了11中题型怎么办
2、用一个数组装10个题型的对错,并按照顺序排列,这是一种方案,
3、更好的方案是用一个数字来标示这10个题目的对错,这10个题目的顺序是固定的,那么就可以把10个题目的对错转成二进制标示,最后就变成一个十进制数字上传到服务器了
那怎样设置呢
首先先搞懂几个运算符
按位与: &
就是说只要两个同位置上的数字不同为1,那么就是0,这有什么作用呢
这个是可以用来取值的 ,比如我想取出第三位的数字是不是正确的
只要在第三个位置是1,其余位置是0.那么按位取与的结果如果有值,那么就表示第三道题正确,如果没有,就表示第三道题错误,那怎么才能&000000100这样的数字呢,其实他就是(1<<3),就表示向左移三位
说完取值,那说说怎么设置题目的正确与否呢,比如我第三道题对了,那我怎么让第三个位置变成1,其余变成0呢
按位或:|
这个时候就需要用到按位或运算符
按位或运算符就是只要有一个是1,那就是1 ,按位或运算符设置完之后,那第三个位置肯定是1了,就表示第三道题设置正确了
那如果我要设置第三道题错误,其他都对呢
按位取反:~
上面我们知道(1<<3)左移运算符标示第三位是1其余是0,但是我们如果设置第三位是0其余不变的话,我们就不能用按位或运算符了,这是后,我们应该与上一个第三位是0,其余都是1的数字
这样就能设置第三题做错了,但是这个11111011怎么写呢,这个时候就是需要用到按位取反~了,我们知道(1<<3)标示00000100,那~(1<<3) 就标示11111011,所以这个时候就设置好了
所以当有多个设置BOOL值的需求的时候,就可以用位运算来做,很方便