【问题标题】:Bitwise operator in if statementif 语句中的位运算符
【发布时间】:2015-02-08 00:20:10
【问题描述】:

在查看代码时,我看到了这一点。

for(i=0; i<n; i++)
{
    for(j=0; j<n; j++)
    {
    if(i & (1<<j))
       {
         //code
       }
    }
}

谁能知道这个循环是如何工作的? 我知道正确的部分会给出 pow(2,j),但我不明白这里将如何工作。

【问题讨论】:

  • 请注意,此代码仅在 n &lt; CHAR_BIT*sizeof(int) 时有效。
  • 好的,你能解释一下 i & 2^j 将如何产生结果吗?

标签: if-statement operators bit-manipulation conditional-statements bitwise-operators


【解决方案1】:

它循环遍历从 0n 的所有值,并针对每个值:
它遍历值中的每一位。如果设置了值:
它执行//code

让我们来看看复杂的部分:

if(i & (1<<j))

1&lt;&lt;j 是设置jth 位(从零开始)的常用方法。如果j==0,则为0b00001,如果j==3,则为0b01000。如果该位在i 中设置,则i &amp; &lt;bit&gt; 评估为&lt;bit>,否则评估为0。所以这会检查jth 位是否在i 中设置。

触发代码的值对如下:

i binary     js
0    000   
1    001     0
2    010        1
3    011     0, 1
4    100           2
5    101     0,    2
6    110        1, 2
etc...
31 11111     0, 1, 2, 3, 4,

注意二进制中的 1 如何反映代码触发的 j 值。

请注意,如果n&gt;=32 则它会尝试将值移动得太远,这是未定义的行为。确保不会发生这种情况。

【讨论】:

    最近更新 更多