if(counter&amp;(1&lt; <j))。what =“”does =“”this =“”statement =“”mean =“”and =“”how =“”it =“”works?=“”

时间:2017-01-13 07:40:33

标签: c

=“”

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

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 个答案:

答案 0 :(得分:12)

声明:

if (counter & (1<<j))

检查j的{​​{1}}位是否已设置。更详细地,counter使用1 << j的移位来生成位掩码,其中仅设置1位。然后,j运算符会屏蔽&j;如果结果不为零(这意味着设置了counter的{​​{1}}位),则满足条件。

考虑以下示例。如果j为320,则其二进制表示为counter,这意味着设置了第6位(对应于64的值);让我们测试那一点。通过将具有二进制表示counter的{​​{1}}移位到右侧6个位置来生成位掩码,这导致二进制值1010000001的值,即:

000000001

001000000结合使用,它是位运算符,位掩码如下:

counter

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

&

满意。在C的语义(不具有本机布尔数据类型)中,当使用 101000000 & 001000000 --------- 001000000 进行检查时,任何非零值都被视为true。