【发布时间】:2013-06-18 18:50:51
【问题描述】:
有两个数字 a 和 b,都是 64 位。
代码:
a = a|b;
如果(!(a&b)){ }
现在在上面的场景中,b 的第 34 位是开启的,而 a 有一些位开启。 因此,根据情况 !(a&b) 应该导致 0 但代码进入了错误的 if 循环。问题是 !(a&b) 给出的是 1 而不是 0。有什么原因吗?
【问题讨论】:
-
在
a = a|b;之后你有(a&b) == b。所以我看到了三种可能性:1)b为 0,与您的想法相反,2)您的实际代码不同,3)编译器有问题。 -
b = 1
-
啊,但是
1 << 33换了一个int。如果int像往常一样是 32 位宽,这是未定义的行为,并且可能导致b为 0(如果1 << 33在源代码中出现,gcc 会这样做;在编译时评估移位时间,然后掩码为 32 位)。请改用1ull << 33。 -
实际上 b = 1ull
-
您能否提供重现该问题的示例代码,这将有助于减少猜测。
标签: c 64-bit bit-manipulation bit-shift