如何在两个32位整数中存储64位整数并再次转换回来

时间:2010-05-11 11:36:13

标签: c++

我很确定它只是一些按位操作的问题,我只是不完全确定我应该做什么,并且所有搜索都返回“64位vs 32位”。

6 个答案:

答案 0 :(得分:36)

包:

u32 x, y;
u64 v = ((u64)x) << 32 | y;

解压缩:

x = (u32)((v & 0xFFFFFFFF00000000LL) >> 32);
y = (u32)(v & 0xFFFFFFFFLL);

答案 1 :(得分:10)

或者,如果您对两个32位数字的含义不感兴趣,那么这就是:

u32 x[2];
u64 z;
memcpy(x,&z,sizeof(z));
memcpy(&z,x,sizeof(z));

答案 2 :(得分:8)

使用 union 并删除位操作:

<stdint.h> // for int32_t, int64_t

union {
  int64_t big;
  struct {
    int32_t x;
    int32_t y;
  };
};
assert(&y == &x + sizeof(x));
这很简单。 big由x和y组成。

答案 3 :(得分:3)

我不知道这是否比union或memcpy解决方案更好,但是我必须解压缩/打包签名的 64位整数并且不想掩盖或转移任何东西,所以我最终只是将64位值视为两个32位值并直接分配它们:

#include <stdio.h>
#include <stdint.h>

void repack(int64_t in)
{
    int32_t a, b;

    printf("input:    %016llx\n", (long long int) in);

    a = ((int32_t *) &in)[0];
    b = ((int32_t *) &in)[1];

    printf("unpacked: %08x %08x\n", b, a);

    ((int32_t *) &in)[0] = a;
    ((int32_t *) &in)[1] = b;

    printf("repacked: %016llx\n\n", (long long int) in);
}

答案 4 :(得分:2)

基本方法如下:

uint64_t int64;
uint32_t int32_1, int32_2;

int32_1 = int64 & 0xFFFFFFFF;
int32_2 = (int64 & (0xFFFFFFFF << 32) ) >> 32;

// ...

int64 = int32_1 | (int32_2 << 32);

请注意,您的整数必须是无符号的;或者操作未定义。

答案 5 :(得分:0)

long x = 0xFEDCBA9876543210;
cout << hex << "0x" << x << endl;

int a = x ; 
cout << hex << "0x" << a << endl;
int b = (x >> 32);
cout << hex << "0x" << b << endl;