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

时间:2018-02-27 19:56:56

标签: c++ c++14 bitwise-operators bit-shift

在将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操作以及左移操作意味着我们单独使用时。但是,这里两个条件语句的组合让我混淆了阅读逻辑。当我搜索引用时,我找不到两个操作一起出现的情况。因此,任何人都能告诉我这里的含义或具体内容吗?

2 个答案:

答案 0 :(得分:6)

检查位置&#39; b&#39;在n的二进制表示中打开或关闭。

if (n & 1 << b) 

基本上是

if (n & (1 << b)) 

因为operator precedence

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