[英]How to correctly unset bits in 64 bit number?
我要设置全部,部分或不设置64位数字的位。 但是,当我打印位表示形式时,例如,我只设置了53位,我看到所有位都是1。 可能是什么问题?
int main() {
uint64_t a = 0;
for (int i = 0; i <= 63; i++)
std::cout<<((a>>i) & 0x01)<<" ";
std::cout<<std::endl;
for (unsigned i = 0; i <= 52; i++)
a |= (1<<i);
for (int i = 0; i <= 63; i++)
std::cout<<((a>>i) & 1)<<" ";
std::cout<<std::endl;
}
编辑:我得到此输出:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
但是最后一个更改后的内容不应包含所有内容。
1
是int
类型的文字。 如果您的计算机具有32位int
,则(1<<i)
将为所有大于30的i
调用未定义的行为。
如果要使用uint64_t
,请始终如一。
a |= (static_cast<uint64_t>(1)<<i);
或简单地
a |= (1ULL<<i);
会成功的
您的程序的行为是不确定的。 因此,就C ++而言,无论您看到什么结果都是完全有效的。
显然,原因是(1<<i)
是int,因为常数1是int。 并且未定义对超过位限制的int(带符号类型)的移位操作。
因此,您需要将表达式强制为std::uint64_t
。 一种这样的方式是这样的:
constexpr std::uint64_t one = 1;
// ...
for (unsigned i = 0; i <= 52; i++)
a |= (one << i);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.