вытаскивание 16-ти бит
От: ra88  
Дата: 22.04.09 11:34
Оценка:
Приветствую!

У меня такая задача. Дано целое беззнаковое число 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
while true;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.