C++ 在64位整数中设置位

C++ 在64位整数中设置位,c++,C++,我试图将64位整数中的一组位设置为1。 正如您在main中的循环中所看到的,我使用setBit函数将位40到47设置为1。 出于某种原因,我不明白16位到23位也被设置为1,正如您从程序输出中看到的: 0000000011111111000000000000000000000000111111110000000000000000 我无法在常规int上模拟相同的行为。 顺便说一句,我也尝试过使用无符号long-long而不是int64\t来解决同样的问题。 我错过了什么 #include <

我试图将64位整数中的一组位设置为1。 正如您在main中的循环中所看到的,我使用setBit函数将位40到47设置为1。 出于某种原因,我不明白16位到23位也被设置为1,正如您从程序输出中看到的: 0000000011111111000000000000000000000000111111110000000000000000 我无法在常规int上模拟相同的行为。 顺便说一句,我也尝试过使用无符号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;
}
#包括
#包括
使用名称空间std;
int64_t x=0;
void setBit(int64_t*num,int index)
{
*num |=(1在子表达式中:

(1 << index)

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

index
也是
int
。这会导致问题吗?@Mr.Llama:不,没关系-对于移位运算符来说,左手操作数的提升类型才是最重要的。最好使用
1ULL
(1LL << index)