Как извлечь четыре беззнаковых коротких целых из одного длинного длинного целого? - PullRequest
5 голосов
/ 29 сентября 2008

Предположим, у меня есть одно длинное длинное целое и я хочу взять его биты и создать из него четыре коротких целых без знака.

Особый порядок здесь не имеет большого значения.

Я обычно знаю, что мне нужно сдвигать биты и усекать до размера unsigned short int. Но я думаю, что где-то совершу странную ошибку, поэтому я спрашиваю.

Ответы [ 3 ]

11 голосов
/ 29 сентября 2008
#include <stdint.h>
#include <stdio.h>

union ui64 {
    uint64_t one;
    uint16_t four[4];
};

int
main()
{
    union ui64 number = {0x123456789abcdef0};
    printf("%x %x %x %x\n", number.four[0], number.four[1],
                            number.four[2], number.four[3]);
    return 0;
}
3 голосов
/ 29 сентября 2008
(unsigned short)((((unsigned long long int)value)>>(x))&(0xFFFF))

, где value - ваш long long int, а x - 0, 16, 32 или 48 для четырех шорт.

2 голосов
/ 29 сентября 2008
union LongLongIntToThreeUnsignedShorts {
   long long int long_long_int;
   unsigned short int short_ints[sizeof(long long int) / sizeof(short int)];
};

Это должно делать то, о чем вы думаете, без необходимости возиться с битами.

...