Как правильно извлечь числа из битового поля? Нужно в int-поле сохранить три числа:int a = 4, b = 7, c = 5; int x = (c > 0 ) & 0xff; b = (x >> 8) & 0x00ff; c = (x >> 16) & 0x0000ffff; Если нет, как правильно? *facepalm* Ещё такой вопрос, как быть, если какое-то из чисел, например a, может принимать отрицательные значения?
Да, ваш способ извлечения чисел из битового поля не совсем правильный. Правильно будет так:
a = x & 0xff; b = (x >> 8) & 0xff; c = (x >> 16) & 0xff;
Если число a может принимать отрицательные значения, то для сохранения его в битовом поле, следует использовать знаковый тип данных, например int8_t (из библиотеки ). В таком случае код может выглядеть так:
int8_t a = -4; // Пример отрицательного значения int8_t b = 7; int8_t c = 5;
int x = ((int)a & 0xff) | ((int)b << 8) | ((int)c << 16);
a = x & 0xff; b = (x >> 8) & 0xff; c = (x >> 16) & 0xff;
Таким образом, числа будут извлечены корректно из битового поля, и отрицательные значения будут сохранены правильно.
Да, ваш способ извлечения чисел из битового поля не совсем правильный. Правильно будет так:
a = x & 0xff;
b = (x >> 8) & 0xff;
c = (x >> 16) & 0xff;
Если число a может принимать отрицательные значения, то для сохранения его в битовом поле, следует использовать знаковый тип данных, например int8_t (из библиотеки ). В таком случае код может выглядеть так:
int8_t a = -4; // Пример отрицательного значения
int8_t b = 7;
int8_t c = 5;
int x = ((int)a & 0xff) | ((int)b << 8) | ((int)c << 16);
a = x & 0xff;
b = (x >> 8) & 0xff;
c = (x >> 16) & 0xff;
Таким образом, числа будут извлечены корректно из битового поля, и отрицательные значения будут сохранены правильно.