if(counter &(1〈〈j))是什么意思?它是如何工作的?

sqxo8psd  于 2022-12-17  发布在  其他
关注(0)|答案(2)|浏览(231)

我在研究子序列的算法。
这句话的意思是什么:

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;
    }
}
mf98qq94

mf98qq941#

声明:

if (counter & (1<<j))

检查counter的第j位是否被设置。更详细地,1 << j使用1的移位来生成位掩码,其中仅第j位被设置。&运算符然后屏蔽掉counterj位;如果结果不为零(这意味着设置了X1 M9 N1 X的第X1 M8 N1 X位),则满足条件。
考虑下面的例子,如果counter是320,其二进制表示是101000000,这意味着第6位(对应于值64的位)被置位;让我们测试该位。位掩码通过将1向右移位6位生成,1的二进制表示为000000001,结果为二进制值001000000counter的值为:

101000000

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

101000000
& 001000000
  ---------
  001000000

001000000再次对应于值64;然而,这在这里并不重要,重要的是它不为零(因为它具有非零位,即,我们想要检查的位)。

if ( 64 )

在C语言的语义中(它不具有本地布尔数据类型的特征),任何非零值在用if检查时都被视为true。

wgmfuz8q

wgmfuz8q2#

---第一个for循环运行i=0到i〈8。(解释-https://www.geeksforgeeks.org/power-set/
---第二次循环运行i=0至i〈3(对于{a,B,c})
1.对于第一循环i=0:

j=0,1,2 in this case (0 & (1<<0)),(0 & (1<<1)),(0 & (1<<2)) 
    
    But 0 with & is always 0 so all instance are false for first loop.

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))是假的。
就这样......

相关问题