Как извлечь четыре коротких целых числа без знака из одного длинного целого числа?

StackOverflow https://stackoverflow.com/questions/148225

Вопрос

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

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

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

Это было полезно?

Решение

#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;
}

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top