繁体   English   中英

设置64位int中的位

[英]setting bits in a 64bit int

我试图将64位int中的一组位设置为1。 正如您在主循环中看到的那样,我使用setBit函数将位40到47设置为1。 由于某种原因,我不明白第16到23位也被设置为1,你可以从程序的输出中看到:0000000011111111000000000000000000000000111111110000000000000000我无法模仿常规int上的相同行为。 BTW我也尝试使用unsigned long long而不是int64_t同样的问题。 我错过了什么?

#include <iostream>
#include <cstdint>
using namespace std;

int64_t x = 0;

 void setBit(int64_t *num, int index)
{
 *num |= (1 << index);
}

bool retreiveBit(int64_t *num, int index)
{
 return *num & (1 << index);
}

int main()
{
 for (int i = 40; i < 48; ++i)
 setBit(&x, i);

 for (int i = 0; i < 64; ++i)
 {
  int digit = retreiveBit(&x, i);
  cout << digit;
 }

 return 0;
}

在子表达式中:

(1 << index)

常量1的类型是int ,所以这个转换是在int完成的。 如果你的int不是64位宽(可能不是),那么这种转换具有未定义的行为。

您需要使用至少64位宽的常量:

(1LL << index)

(您需要在setBit()retrieveBit()函数中执行此操作)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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