Здравствуйте, 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, и скорее всего будет медленней, но не факт — зависит от компилятора.