C#中的&运算符的妙用

今日查bug,遇到一个有点懵逼的语句

if ((success && (flag & 2) == 2) || (!success && (flag & 1) == 1))

第一反应这是只能在成功且flag为2或者失败且flag为1的情况下进判断,有没有办法让他成功失败都进呢,换句话说,怎样可以让flag & 2 == 2flag & 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 == 2flag & 1== 1)同时成立的。(比如11(3),111(7)等)

通用性地说,能够同时x&a==ax&b==b同时成立的x,应该在a,b有任何一个数为1的位也为1。

进一步延伸,能够同时x&a==ax&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次方,好记,哈哈哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值