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))
这些是 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
位的位置,则 n & (1 << b)
只会得到 non-zero 结果=27=] 已打开。如果不是,所有位都将关闭,因为它已经是 0
,它将保持 0
,最终结果将是 0
.
if
语句接收到这个最终结果,如果为正(该位为on)则进入if
,否则(如果该位为off),最终结果为0 和 if
语句会将语句 n & (1 << b)
视为 false
.
在参考 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))
这些是 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
位的位置,则 n & (1 << b)
只会得到 non-zero 结果=27=] 已打开。如果不是,所有位都将关闭,因为它已经是 0
,它将保持 0
,最终结果将是 0
.
if
语句接收到这个最终结果,如果为正(该位为on)则进入if
,否则(如果该位为off),最终结果为0 和 if
语句会将语句 n & (1 << b)
视为 false
.