我正在研究子序列算法。 请告诉我这句话的意思。 程序如下。
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;
}
}
答案 0 :(得分:12)
声明:
if (counter & (1<<j))
检查j
的{{1}}位是否已设置。更详细地,counter
使用1 << j
的移位来生成位掩码,其中仅设置1
位。然后,j
运算符会屏蔽&
位j
;如果结果不为零(这意味着设置了counter
的{{1}}位),则满足条件。
考虑以下示例。如果j
为320,则其二进制表示为counter
,这意味着设置了第6位(对应于64的值);让我们测试那一点。通过将具有二进制表示counter
的{{1}}移位到右侧6个位置来生成位掩码,这导致二进制值101000000
。 1
的值,即:
000000001
与001000000
结合使用,它是位运算符,位掩码如下:
counter
值101000000
再次对应于值64;但是这里并不重要,它只是不重要(因为它有一个非零位,即我们打算检查的位)。总的来说,条件
&
满意。在C的语义(不具有本机布尔数据类型)中,当使用 101000000
& 001000000
---------
001000000
进行检查时,任何非零值都被视为true。