2008-09-29 1 views
5

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

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

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

ответ

11
#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; 
} 
+0

Будет ли это зависеть от маленького/big-endian? – slashmais 2008-09-29 10:59:52

+0

Да, вы получаете разные результаты для систем с большим энтузиазмом по сравнению с малопринятыми. – 2008-09-29 11:03:00

+0

Это определенно быстрое и хакерское решение в том же порядке, что и: «@numbers = распаковать« S4 », пакет« Q », $ number;» в Perl – 2008-09-29 11:04:05

2
union LongLongIntToThreeUnsignedShorts { 
    long long int long_long_int; 
    unsigned short int short_ints[sizeof(long long int)/sizeof(short int)]; 
}; 

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

3
(unsigned short)((((unsigned long long int)value)>>(x))&(0xFFFF)) 

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

Смежные вопросы