(n & 1 << b) 在 C++ 中的含义
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;
}
我知道按位 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))
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 如何显式调用运算符<<
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 左角支架解释为操作员&lt;而不是模板参数
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- 超载操作员&lt;&lt; - 必须是二进制操作员
- 没有匹配的“运营商&lt;&lt;”