关于C#:if (counter & (1<

if (counter & (1<<j)) .what does this statement mean and how it works?

本问题已经有最佳答案,请猛点这里访问。

我正在研究一种子序列的算法。请告诉我这句话的意思。程序如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void printSubsequences(int arr[], int n)
{
    unsigned int opsize = pow(2, n);

    for (int counter = 1; counter < opsize; counter++)
    {
        for (int j = 0; j < n; j++)
        {
            if (counter & (1<<j))
                cout << arr[j] <<"";
        }
        cout << endl;
    }
}


声明:

1
if (counter & (1<<j))

检查是否设置了counterj第位。更详细地说,1 << j使用1的移位来生成一个位掩码,其中只设置了j第位。然后,&操作符屏蔽counterj位;如果结果不是零(即设置了counterj位),则满足条件。

考虑下面的例子。如果counter是320,它的二进制表示是101000000,这意味着设置了第6位(对应于64的值);让我们来测试该位。位掩模是通过移动1产生的,它的二进制表示为000000001,向右6位,从而产生二进制值001000000counter的价值,即:

1
101000000

与位与运算符&组合,位掩码如下:

1
2
3
4
  101000000
& 001000000
  ---------
  001000000

001000000再次对应于64的值;但是这在这里并不重要,它只关系到它不是零(因为它有一个非零位,即我们打算检查的位)。总的来说,情况

1
if ( 64 )

是满意的。在C的语义(不具有本机布尔数据类型)中,当使用if检查时,任何非零值都被视为真。