C#按位AND运算符'&'逻辑

时间:2016-03-21 10:44:30

标签: c# logic operators unary-operator

我发现很难理解'&'运算符与此代码的关系如何:

for(int cnt = 0; cnt < (1 << somelist.Count()); ++cnt)
{
    for (int i = 0; i < somelist.Count(); ++i)
    {
        //  1 << 0 -- 1 -> 1
        //  1 << 1 -- 10 -> 2
        //  1 << 2 -- 100 -> 4
        //  1 << 3 -- 1000 -> 8
        //  1 << 4 -- 10000 -> 16
        //  1 << 5 -- 100000 -> 32

        var l = (1 << i);
        if ((cnt & l) == 0)
        {
            // when is it getting here?
            // some code to execute
        }

    }
}

哪些是进入if条件的情况和那些不进入的情况?为什么?

我已经在它上面使用了调试器,它背后的逻辑还不清楚。它的作用是:

e.g.

var cnt = 0
var l = 1
if ((cnt & l)==0){ // true }

var cnt = 1
var l = 1
if ((cnt & l)==0){ // false }

var cnt = 1
var l = 2
if ((cnt & l)==0){ // true }

var cnt = 1
var l = 4
if ((cnt & l)==0){ // true }

var cnt = 3
var l = 2
if ((cnt & l)==0){ // false }

var cnt = 3
var l = 4
if ((cnt & l)==0){ // true }

1 个答案:

答案 0 :(得分:3)

你需要了解&amp;有点明智和操作员工作。

Bitwise AND Operator: &

  

按位AND运算符(&amp;)将第一个操作数的每个位进行比较   第二个操作数的对应位。如果两个位都是1,那么   对应的结果位设置为1.否则,对应   结果位设置为0。

为了简单起见,我只用了一个字节来解释。

第一个案例

var cnt = 1
var l = 1
if ((cnt & l)==0){ // false }

00000001
00000001
===============
00000001

比较00000001(1为零)将返回false,因为1不等于零。

第二种情况

var cnt = 1
var l = 2
if ((cnt & l)==0){ // true }

00000001
00000010
===============
00000000

比较00000000(0为零)将返回true,因为0等于零。