在引用 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;
}
当我们分开使用时,我知道按位与运算和左移运算的意思。但是,这里将两者结合在条件语句中使我难以阅读逻辑。当我搜索引用时,我找不到两个操作一起出现的情况。因此,任何人都可以告诉我这里的含义或到底发生了什么吗?
最佳答案
检查 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
等等。
当你&
值 1 << b
与 n
你基本上关闭了所有n
的位,除了对应于 1
的位置中的位在 1 << b
的二进制表示中.
这意味着您只会得到 n & (1 << b)
的非零结果如果 n
的位那是在对应于 1
的位置一点 (1 << b)
被打开。如果不是,所有位都将关闭,因为它已经是 0
。 , 它会留在 0
最终结果将是 0
.
if
语句接收此最终结果,如果为正(该位已打开),它将进入 if
,否则(如果该位关闭),最终结果将为 0 和 if
声明将考虑声明 n & (1 << b)
成为false
.
关于c++ - C++ 中 (n & 1 << b) 的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49016926/