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

C# bitwise AND operator '&' logic

我发现很难理解“&”运算符如何与这段代码相关:

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条件的情况和不进入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 }

您需要了解 & bit wise 和 operator 的工作原理。

Bitwise AND Operator: &

The bitwise AND operator (&) compares each bit of the first operand to the corresponding bit of the second operand. If both bits are 1, the corresponding result bit is set to 1. Otherwise, the corresponding result bit is set to 0.

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

第一种情况

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

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

将 00000001(即 1)与零进行比较将 return 为假,因为 1 不等于零。

第二种情况

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

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

比较 0 和零的 00000000 将 return 为真,因为 0 等于零。