Я уверен, что это всего лишь вопрос о некоторых побитовых операциях, я просто не совсем уверен в том, что я должен делать, и все поисковые запросы возвращают "64-разрядные версии до 32 бит".
Как сохранить 64-битное целое число в двух 32-битных целых числах и преобразовать обратно
Ответ 1
пакет:
u32 x, y;
u64 v = ((u64)x) << 32 | y;
распаковка:
x = (u32)((v & 0xFFFFFFFF00000000LL) >> 32);
y = (u32)(v & 0xFFFFFFFFLL);
Ответ 2
Или это, если вас не интересует то, что означают два 32-битных числа:
u32 x[2];
u64 z;
memcpy(x,&z,sizeof(z));
memcpy(&z,x,sizeof(z));
Ответ 3
Используйте объединение и избавляйтесь от бит-операций:
<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.
Ответ 4
Основной метод заключается в следующем:
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);
Обратите внимание, что целые числа должны быть без знака; или операции undefined.
Ответ 5
Я не знаю, было ли это лучше, чем решения 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);
}