语句 if (counter & (1<<j)) mean and how does it work?

问题描述 投票:0回答:3

我正在研究子序列算法。

这句话的含义是什么:

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;
    }
}
c conditional-statements bit-manipulation bitwise-operators bit-shift
3个回答
31
投票

声明:

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。


1
投票

---首先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.
  1. 让我们考虑第二个循环 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.

  2. 让我们进行第二个循环 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.

  3. 让我们考虑第二个循环 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.

  4. 让我们考虑第二个循环 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.

就这样继续下去......


0
投票

语句 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.
); }

-



==========

© www.soinside.com 2019 - 2024. All rights reserved.