Как сохранить целое число на 64 бита в двух целых числах на 32 бита и преобразовать назад снова

Я вполне уверен его просто вопрос некоторых битовых операций, я просто не совсем уверен в точно, что я должен делать, и все поиски возвращают назад "64 бита по сравнению с 32 битами".

27
задан Stowelly 1 October 2015 в 14:11
поделиться

4 ответа

pack:

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

unpack:

x = (u32)((v & 0xFFFFFFFF00000000LL) >> 32);
y = (u32)(v & 0xFFFFFFFFLL);
37
ответ дан 28 November 2019 в 04:48
поделиться

Или вот это, если вас не интересует, что означают два 32-битных числа:

u32 x[2];
u64 z;
memcpy(x,&z,sizeof(z));
memcpy(&z,x,sizeof(z));
10
ответ дан 28 November 2019 в 04:48
поделиться

Используйте объединение 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.

8
ответ дан 28 November 2019 в 04:48
поделиться

Основной метод заключается в следующем:

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);

Обратите внимание, что ваши целые числа должны быть беззнаковыми; иначе операции не определены.

2
ответ дан 28 November 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: