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

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

本文关键字:lt C++      更新时间:2023-10-16

在引用其他人在 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;
}

我知道按位 AND 操作以及左移操作意味着我们单独使用时。但是,在这里,条件语句中两者的组合使我在阅读逻辑时感到困惑。当我搜索参考文献时,我找不到两个操作同时出现的情况。因此,谁能告诉我这里的含义或到底发生了什么?

这是一个检查,以查看 n 的二进制表示中位置"b"处的位是打开还是关闭。

if (n & 1 << b) 

本质上是

if (n & (1 << b)) 

因为运算符优先级。

这些是 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

等等。

当你用n&1 << b时,你基本上关闭了n的所有位,除了与1 << b二进制表示中的1相对应的位置的位。

这意味着,仅当与(1 << b)1对应的位置中的n位打开时,您才会获得n & (1 << b)的非零结果。如果不是,所有的位都会关闭,因为它已经0,它将保持0,最终结果将是0

if语句收到这个最终结果,如果它是正的(位打开),它将进入if,否则(如果位关闭),最终结果将为 0,if语句将认为该语句n & (1 << b)false

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

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