我试图将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;
}
Run Code Online (Sandbox Code Playgroud)
在子表达式中:
(1 << index)
Run Code Online (Sandbox Code Playgroud)
常数的类型1是int,所以这种转变是在一个int.如果你的int宽度不是64位(可能不是),那么这种转变具有未定义的行为.
您需要使用至少64位宽的常量:
(1LL << index)
Run Code Online (Sandbox Code Playgroud)
(你需要在setBit()和retrieveBit()函数中都这样做).