我在研究子序列的算法。
这句话的意思是什么:
if (counter & (1<<j))
在以下方案的范围内:
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;
}
}
2条答案
按热度按时间mf98qq941#
声明:
检查
counter
的第j
位是否被设置。更详细地,1 << j
使用1
的移位来生成位掩码,其中仅第j
位被设置。&
运算符然后屏蔽掉counter
的j
位;如果结果不为零(这意味着设置了X1 M9 N1 X的第X1 M8 N1 X位),则满足条件。考虑下面的例子,如果
counter
是320,其二进制表示是101000000
,这意味着第6位(对应于值64的位)被置位;让我们测试该位。位掩码通过将1
向右移位6位生成,1
的二进制表示为000000001
,结果为二进制值001000000
。counter
的值为:与
&
(位与运算符)组合,位掩码如下:值
001000000
再次对应于值64;然而,这在这里并不重要,重要的是它不为零(因为它具有非零位,即,我们想要检查的位)。在C语言的语义中(它不具有本地布尔数据类型的特征),任何非零值在用
if
检查时都被视为true。wgmfuz8q2#
---第一个for循环运行i=0到i〈8。(解释-https://www.geeksforgeeks.org/power-set/)
---第二次循环运行i=0至i〈3(对于{a,B,c})
1.对于第一循环i=0:
1.对于第二个循环i=1:
j=0 int这种情况下(1 &(1〈〈0))它为真,所以j=0且arr[0]=a打印。
j= 1,2是假的,因为(1 &(1〈〈1))和(1 &(1〈〈2))是假的.
1.对于第二个循环i=2:
j=1,int在这种情况下(2 &(1〈〈1))它是真,所以j=1和arr[1]=B打印。
j= 0,2是假的,因为(2 &(1〈〈0))和(2 &(1〈〈2))是假的.
1.对于第二个循环i=3:
j= 0,2 int这种情况下(3 &(1〈〈2))&(3 &(1〈〈2))为真,所以j= 0,2并且arr[2] =a & c打印。
j=1为假,因为(3 &(1〈〈1))为假。
1.对于第二个循环i=4:
j=2 int这种情况下(4 &(1〈〈2))它为真,所以j=2和arr[2] =c打印。
j= 0,1是假的,因为(4 &(1〈〈0))和(4 &(1〈〈1))是假的。
就这样......