Приветствую!
У меня такая задача. Дано целое беззнаковое число 32-битное или 64-битное.
Надо поотдельности вытащить из него младшие 16 бит, следующие 16 бит
и 16 бит после них.
Вопрос, как лучше всего сделать? У меня два варианта:
1.
typedef unsigned long long uint64;
typedef unsigned int uint32;
typedef unsigned short uint16;
#define HH16(x) ((uint16)(((uint64)x & 0xFFFF00000000LU) >> 32))
#define HI16(x) ((uint16)(((uint64)x & 0xFFFF0000LU) >> 16))
#define LO16(x) ((uint16)((uint64)x & 0xFFFFLU))
// затем:
....
uint64 x = 328237324242L;
uint32 y = 324982372
printf("word0 = %u, word1= %u, word2 = %u\n", HH16(x), HI16(x), LO16(x));
printf("word0 = %u, word1= %u, word2 = %u\n", HH16(y), HI16(y), LO16(y));
либо
2.
typedef struct {
uint16 word0;
uint16 word1;
uint16 word2;
} three16_t;
// затем
....
uint64 x = 328237324242L;
uint32 y = 324982372
three16_t tmp;
tmp = *((three16_t*)&x);
printf("word0 = %u, word1= %u, word2 = %u\n", tmp.word2, tmp.word1, tmp.word0);
tmp = *((three16_t*)&y);
printf("word0 = %u, word1= %u, word2 = %u\n", tmp.word2, tmp.word1, tmp.word0);
Кто из них быстрее? Не будет ли проблем у второго метода на big endian машине c другим компилятором?
язык C (gcc 4.3.2), платформа linux