在将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操作以及左移操作意味着我们单独使用时。但是,这里两个条件语句的组合让我混淆了阅读逻辑。当我搜索引用时,我找不到两个操作一起出现的情况。因此,任何人都能告诉我这里的含义或具体内容吗?
答案 0 :(得分:6)
检查位置&#39; b&#39;在n的二进制表示中打开或关闭。
if (n & 1 << b)
基本上是
if (n & (1 << b))
这些值是1&lt;&lt; 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
语句收到这个最终结果,如果它是正数(该位开启)它将进入if
,否则(如果该位关闭),最终结果将为0,n & (1 << b)
语句将语句false
视为--allow-unauthenticated
。
答案 1 :(得分:0)
每http://en.cppreference.com/w/cpp/language/operator_precedence
<<
优先于&
。因此,与@ Ryan的评论一样,(n & 1 << b)
相当于(n & (1 << b))