C++ 中 (n & 1 << b) 的含义

Meaning of (n & 1 << b) in C++

在参考 CodeChef 中其他人为特定问题编写的 C++ 代码时,我发现了一种新方法(至少对我而言)来编写这样的条件语句:if (n & 1 << b)。 整个代码片段(一个函数)如下:

int Solve(int tim, int n)
{
    if (tim < 0) 
         return 1;

    int res = 0;
    for (int b = Maxb - 1; b >= 0; b--)
        if (n & 1 << b) 
        {
            int my = b - __builtin_popcount(tim & ((1 << b) - 1));
            res += 1 << my;

            if (tim & 1 << b) 
                 return res;
        }

    res++;
    return res;
}

我知道单独使用时的按位与运算和左移运算的意思。但是,这里将两者结合在条件语句中使我难以阅读逻辑。当我搜索参考时,我找不到两个操作一起出现的情况。因此,谁能告诉我这里的含义或到底发生了什么?

http://en.cppreference.com/w/cpp/language/operator_precedence

<< 优先于 &。所以,就像@Ryan 的评论一样,(n & 1 << b) 等同于 (n & (1 << b))

检查 n 的二进制表示中位置 'b' 的位是否打开或关闭。

if (n & 1 << b) 

本质上是

if (n & (1 << b)) 

因为 operator precedence.

这些是 1 << b 得到的值(右边是二进制):

对于 b == 0,(1 << b) == ...000000001

对于 b == 1,(1 << b) == ...000000010

对于 b == 2,(1 << b) == ...000000100

对于 b == 3,(1 << b) == ...000000100

对于 b == 3,(1 << b) == ...000001000

对于 b == 4,(1 << b) == ...000010000

等等。

当您 &1 << bn 时,您实际上关闭了 n 的所有位,除了与 11 << b.

的二进制表示中

这意味着如果 n 的位位于对应于 1 位的位置,则 n & (1 << b) 只会得到 non-zero 结果=27=] 已打开。如果不是,所有位都将关闭,因为它已经是 0,它将保持 0,最终结果将是 0.

if语句接收到这个最终结果,如果为正(该位为on)则进入if,否则(如果该位为off),最终结果为0 和 if 语句会将语句 n & (1 << b) 视为 false.