@SibVektor

Как правильно извлечь числа из битового поля?

Нужно в int-поле сохранить три числа:
int a = 4, b = 7, c = 5;
int x = (c << 16) | (b << 8) | a);


Потом нужно извлечь эти числа, правильно ли я сделал?
a = (x >> 0 ) & 0xff;
b = (x >> 8) & 0x00ff;
c = (x >> 16) & 0x0000ffff;


Если нет, как правильно? *facepalm*
Ещё такой вопрос, как быть, если какое-то из чисел, например a, может принимать отрицательные значения?
  • Вопрос задан
  • 244 просмотра
Решения вопроса 2
15432
@15432
Системный программист ^_^
Правильно. Ведущие нули не нужны, просто 0xFF или 0xFFFF. Но можно проще:

struct BitField{
    union{
        int value;
        struct{
            int a:8;
            int b:8;
            int c:16;
        };
    };
};

BitField MyBits;
MyBits.a = 4; //fill the internal bit structure
MyBits.b = 7;
MyBits.c = 5;
cout << MyBits.value; //print the full int representation
Ответ написан
1. в одном int можно хранить только 1 int
2. зато можно сохранить четыре int8_t или uint8_t ( #include < stdint.h> )

итак, если нужно уметь в отрицательные числа:
int8_t a = 4, b = 7, c = 6;
int32_t x = (c << 16) | (b << 8) | a;

// извлекаем:
a = (x & 0x000000FF);
b = (x & 0x0000FF00) >> 8;
c = (x & 0x00FF0000) >> 16;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Вопрос "правильности" в первую очередь связан с диапазоном значений, которые могут принимать a, b и c.
Ваша запись будет работать для a и b от 0 до 255 и c от 0 до 32767.
С отрицательными значениями, в принципе, работать можно, но надо дополнять знак при обратном преобразовании, например так (a от -128 до 127)
a = x & 0xFF;
if (a & 0x80) 
  a &= -1;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы