gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:44:25 25 4
gpt4 key购买 nike

在引用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com