Как сохранить 64-битное целое число в двух 32-битных целых и преобразовать обратно - PullRequest
27 голосов
/ 11 мая 2010

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

Ответы [ 6 ]

36 голосов
/ 11 мая 2010

пакет:

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

распаковка:

x = (u32)((v & 0xFFFFFFFF00000000LL) >> 32);
y = (u32)(v & 0xFFFFFFFFLL);
10 голосов
/ 11 мая 2010

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

u32 x[2];
u64 z;
memcpy(x,&z,sizeof(z));
memcpy(&z,x,sizeof(z));
8 голосов
/ 11 мая 2010

Используйте union и избавьтесь от битовых операций:

<stdint.h> // for int32_t, int64_t

union {
  int64_t big;
  struct {
    int32_t x;
    int32_t y;
  };
};
assert(&y == &x + sizeof(x));

просто так. большой состоит из х и у.

3 голосов
/ 16 октября 2012

Я не знаю, лучше ли это, чем решения 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);
}
2 голосов
/ 11 мая 2010

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

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

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

0 голосов
/ 25 декабря 2018
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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...