gpt4 book ai didi

c++ - 是否设置?函数仅在写为 Oneliner 时返回错误结果

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

我对测试某个位是否设置为无符号整数(16 位)值的函数的行为感到非常困惑。

我正在测试的号码:57393 (1110 0000 0011 0001)

非工作函数是

bool IsBitSet(int bit, unsigned int value)
{
return (((unsigned int)1) << bit) & value > 0;
}

正在测试 bit = 0; bit < 7; bit++ 的功能我得到结果:1 0 0 0 0 0这显然是不正确的。

然后我将函数重写为单独的步骤:

bool IsBitSet(int bit, unsigned int value)
{
unsigned int test = ((unsigned int)1) << bit;
test = test & value;
if (test > 0) {
return true;
}
else {
return false;
}
}

在我看来,这应该完全一样。但是现在我得到了正确的输出:1 0 0 0 1 1 .

鉴于对 C++ 的经验很少,我无法弄清楚这两个函数之间的区别是什么。我可以保留较长的函数,但我想了解我哪里出错了,以免再次遇到这种情况。

代码是为 Arduino 平台编译的,由于字长或编译器行为,这可能很重要。

最佳答案

原来我找到了答案。我遇到了运算符优先级的问题。做的时候

(((unsigned int)1) << bit) & value > 0

大于运算符 >优先于按位与运算符 & , 所以 value > 0首先评估为 bool true,它隐式转换为 1。

然后(((unsigned int)1) << bit) & 1被评估,给出 1如果bit=0 , 或 0在其他情况下。该值然后再次隐式转换为 bool 以返回。

因此,问题在于未能在没有警告的情况下将运算符优先级与隐式强制转换相结合。逐步运行函数,优先级没有问题,因为比较总是在按位与之后进行。

可以使用额外的支架固定 Oneliner:

return ((((unsigned int)1) << bit) & value) > 0;

关于c++ - 是否设置?函数仅在写为 Oneliner 时返回错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51194098/

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