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

标签 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;
}

当我们分开使用时,我知道按位与运算和左移运算的意思。但是,这里将两者结合在条件语句中使我难以阅读逻辑。当我搜索引用时,我找不到两个操作一起出现的情况。因此,任何人都可以告诉我这里的含义或到底发生了什么吗?

最佳答案

检查 n 的二进制表示中位置 'b' 的位是打开还是关闭。

if (n & 1 << b) 

本质上是

if (n & (1 << b)) 

因为operator precedence .

这些是 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 << bn你基本上关闭了所有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/

相关文章:

python - 使用 C++/Python 对 wav 文件进行 FFT

java - 将 openssl 迁移到 java

c++跨编译单元的增量类型ID

c++ - decltype 行为背后的基本原理是什么?

c++ - 在 wxpython 中打开 Excel

C++,将两个参数包传递给构造函数

c++ - 矩阵迭代的逐位移位?

c - unsigned long long 类型的位移位

c - 在检查正整数 N 是否为大 N 的 2 次幂时出现错误

c++ - thread_guard 与 scoped_thread