今日查bug,遇到一个有点懵逼的语句
if ((success && (flag & 2) == 2) || (!success && (flag & 1) == 1))
第一反应这是只能在成功且flag为2或者失败且flag为1的情况下进判断,有没有办法让他成功失败都进呢,换句话说,怎样可以让flag & 2 == 2
和flag & 1== 1
同时成立呢?
想了一下脑袋还没反应过来,旁边大佬看了一眼说flag=3不就好了吗,试了一下还真是,为什么呢,除了3还有别的值可以吗?由此展开思考。
仔细看了一下&的逻辑,按位与,也就是只有两个数转二进制后同一位都为1时,&的对应位才为1
例如,
3&2 即,11&10=10,即&结果为2
那么,要让一个数和2进行&运算结果为2,那就必须这个数本身,在2的二进制为1的位也为1,也就是十位要为1(这里的十位是借用十进制的说法了)
同理,要让一个数和1进行&运算结果为1,就必须在1的二进制为1的位,也就是个位为1。
所以,一切个位和十位都为1的二级制数,都是能让文章开头的判断(flag & 2 == 2和
flag & 1== 1)同时成立的。(比如11(3),111(7)等)
通用性地说,能够同时x&a==a
和x&b==b
同时成立的x,应该在a,b有任何一个数为1的位也为1。
进一步延伸,能够同时x&a==a
和x&b==b
同时成立的a,b本身,应该具有什么特点,原本我认为应该符合转为二进制之后,从高位到低位,只有一位为1,其余均为0,比如1(1),10(2),100(4),这样两个数各有一个位为1,x则有两个位为1,看起来简单又完美,但尝试了一下发现不必如此,
101&1101=101(5&13=5)
1001&1101=1001(9&13=9)
不过使用只有一位为1的二进制数来和x做&运算还是有好处的,这样a,b都是2的n次方,好记,哈哈哈哈