c++ - 在 64 位 int 中设置位

标签 c++

我正在尝试将 64 位 int 中的一组位设置为 1。 正如您在 main 的循环中看到的那样,我使用 setBit 函数将位 40 到 47 设置为 1。 出于某种原因,我不明白第 16 位到第 23 位也设置为 1,正如您从程序的输出中看到的那样: 00000000111111110000000000000000000000001111111100000000000000000 我无法在常规 int 上模仿相同的行为。 顺便说一句,我也尝试使用 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() 函数中执行此操作)。

关于c++ - 在 64 位 int 中设置位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31363277/

相关文章:

c++ - 如何始终在一行中获得一条 C++ 语句? (格式化/ clang-format )

c++ - 来自 addr2line 的错误行号

c++ - 即使使用 malloc,两个 char * 也可以具有相同的内存地址吗?

c++ - Tesseract API - 获取每个文本框的位置

c++ - 创建 C++ 整数类以与整型整数类型完全相同

c++ - 关于 C++ 中的运算符重载

c++ - 如何复制 IMFSample 对象

c++ - 什么是 &= 和 |=

c++ - 覆盖 ADL 选择的重载

c++ - 是否可以内联 lambda 表达式?