繁体   English   中英

如何正确取消设置64位数字中的位?

[英]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

但是最后一个更改后的内容不应包含所有内容。

1int类型的文字。 如果您的计算机具有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM