Re: вытаскивание 16-ти бит
От: spring  
Дата: 22.04.09 13:13
Оценка: 1 (1)
Здравствуйте, ra88, Вы писали:

R>Приветствую!


R>У меня такая задача. Дано целое беззнаковое число 32-битное или 64-битное.

R>Надо поотдельности вытащить из него младшие 16 бит, следующие 16 бит
R>и 16 бит после них.

R>Вопрос, как лучше всего сделать? У меня два варианта:

R>1.
R>
R>typedef unsigned long long uint64;
R>typedef unsigned int       uint32;
R>typedef unsigned short     uint16;

R>#define HH16(x) ((uint16)(((uint64)x & 0xFFFF00000000LU) >> 32))
R>#define HI16(x) ((uint16)(((uint64)x & 0xFFFF0000LU) >> 16))
R>#define LO16(x) ((uint16)((uint64)x & 0xFFFFLU))

R>// затем:
R>....
R>uint64 x = 328237324242L;
R>uint32 y = 324982372
R>printf("word0 = %u, word1= %u, word2 = %u\n", HH16(x), HI16(x), LO16(x));
R>printf("word0 = %u, word1= %u, word2 = %u\n", HH16(y), HI16(y), LO16(y));

быстрее

А ещё можно сделать так:

R>#define HH16(x) ((uint16)((((uint64)x << 16) >> 48))
R>#define HI16(x) ((uint16)((((uint64)x << 32) >> 48))
R>#define LO16(x) ((uint16)((((uint64)x << 48) >> 48))

скорее всего будет ещё быстрее :)

R>

R>либо
R>2.
Будут проблеммы на big endian, и скорее всего будет медленней, но не факт — зависит от компилятора.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.