我正在研究子序列算法。
这句话的含义是什么:
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;
}
}
声明:
if (counter & (1<<j))
检查
j
的第 counter
位是否已设置。更详细地说,1 << j
使用1
的移位来生成位掩码,其中仅设置第j
位。然后 &
运算符屏蔽 j
的 counter
位;如果结果不为零(这意味着设置了 j
的第 counter
位),则满足条件。
考虑以下示例。如果
counter
为320,则其二进制表示为101000000
,表示第6位(对应于64的值)被设置;让我们测试一下。位掩码是通过移位 1
生成的,其二进制表示形式为 000000001
,向右移动 6 位,得到二进制值 001000000
。 counter
的值,即:
101000000
与
&
组合,即按位与运算符,位掩码如下:
101000000
& 001000000
---------
001000000
值
001000000
再次对应于值64;然而,这在这里并不重要,重要的是它不为零(因为它有一个非零位,即我们打算检查的位)。总共条件
if ( 64 )
很满意。在 C 的语义中(不具有本机布尔数据类型),当使用
if
检查时,任何非零值都被视为 true。
---首先for循环运行i=0到i<8 .(explanation - https://www.geeksforgeeks.org/power-set/)
---第二次循环运行 i=0 到 i<3 (for {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.
让我们考虑第二个循环 i=1 :
j=0 int 这种情况 (1 & (1<<0)) it is true so j=0 and arr[0]=a print.
j=1,2 为假,因为 ( 1 & (1<<1)) & (1 & (1<<2)) are false.
让我们进行第二个循环 i=2 :
j=1,在这种情况下 (2 & (1<<1)) it is true so j=1 and arr[1]=b print.
j=0,2 为假,因为 ( 2 & (1<<0)) & (2 & (1<<2)) are false.
让我们考虑第二个循环 i=3 :
j=0,2 int 这种情况 (3 & (1<<2)) & (3 & (1<<2)) it is true so j=0,2 and arr[2] =a & c print.
j=1 为假,因为 ( 3 & (1<<1)) are false.
让我们考虑第二个循环 i=4 :
j=2 int 这种情况 (4 & (1<<2)) it is true so j=2 and arr[2] =c print.
j=0,1 为假,因为 ( 4 & (1<<0)) & (4 & (1<<1)) are false.
就这样继续下去......
语句 if (counter & (1<
其工作原理如下:
(1<
计数器 & (1<
如果按位与运算的结果非零,则表示计数器的第 j 位设置为 1。
let counter = 10; // Binary representation: 1010
令 j = 2;
if (计数器 & (1 << j)) { console.log(
The ${j}-th bit of counter is set.
);
} 别的 {
控制台.log(The ${j}-th bit of counter is not set.
);
}
-
==========