【问题标题】:setting bits in a 64bit int在 64 位 int 中设置位
【发布时间】:2015-07-12 08:49:45
【问题描述】:

我正在尝试将 64 位 int 中的一组位设置为 1。 正如您在 main 循环中看到的那样,我正在使用 setBit 函数将位 40 到 47 设置为 1。 出于某种原因,我不明白第 16 位到第 23 位也设置为 1,正如您从程序的输出中看到的那样: 0000000011111111000000000000000000000000111111110000000000000000 我无法在常规 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;
}

【问题讨论】:

    标签: c++


    【解决方案1】:

    在子表达式中:

    (1 << index)
    

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

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

    (1LL << index)
    

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

    【讨论】:

    • index 也是int。这会导致问题吗?
    • @Mr.Llama:不,没关系 - 对于移位运算符,左侧操作数的提升类型很重要。
    • 最好改用1ULL
    猜你喜欢
    • 2011-08-14
    • 2010-09-14
    • 2023-03-19
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    相关资源
    最近更新 更多