bogdan_uman
@bogdan_uman
шлЫмазл неукЪ-поцЪ

Побитовая маска для значения 0...4 для каждого разряда?

Здравствуйте. Подскажите пожалуйста. У меня есть 4 значения ( 0 или 1) который хранится в двоичном значении и уже маской можно получить нужное значение, например

const value = 0b1010;

const v1 = value & 0b1000;
const v2 = value & 0b0100;
const v3 = value & 0b0010;
const v4 = value & 0b0001;


Но теперь как лучше всего сделать, что бы хранить значения от 0 до 4?

Спасибо.
  • Вопрос задан
  • 105 просмотров
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
0..4 - это пять значений, нужна трёхбитовая маска, например 0b111, 0b111000, 0b111000000.
Ещё вариант - переводить из пятеричной системы в десятичную (1235 = 3810).
Зависит от того, для чего нужно упаковывать данные.
Ответ написан
Xuxicheta
@Xuxicheta
инженер
может все-таки так?
const value = 0b1010; // 1+0+1+0

const v1 = (value & 0b1000) >> 3; // 1
const v2 = (value & 0b0100) >> 2; // 0
const v3 = (value & 0b0010) >> 1; // 1
const v4 = (value & 0b0001) >> 0; // 0



const value1 = 0b11001; // 1 + 100 (4) + 1
const mask = 0b01110 // вырезаем 2,3,4 бит

const v5 = (value1 & 0b01110) >> 1; // 100 (4)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
john36allTa
@john36allTa
alien glow of a dirty mind
Хранить в char, операция & булева и не зависит от того 0b11 или 3 в операндах.
const a = 0b1010, b = 0b1000;// 10, 8
(10&8) == (a&b); // true
//распаковать
let flags = a.toString(2).split('').map(Number);//Array(4) [ 1, 0, 1, 0 ]
flags[2] = 0; //изменить
//упаковать
let mask = parseInt(flags.join(''),2); // 8
// в базе хранить 8

Если есть возможность хранить в меньшем объёме, то храните в типе размером 4 бита (tinyint(4) в mySQL к примеру). Хотя байт итак уже мизерный размер для данных + резерв на будущее будет.
Ответ написан
Комментировать
@rPman
Если вам так уж прямо надо хранить в структуре (т.е. эффективно без затрат) значения меньше байта, используйте побитовые поля в структурах, причем компилятор автоматически будет рапределять биты по словам (точнее указанным типам) значения

https://en.cppreference.com/w/cpp/language/bit_field
Ответ написан
Ваш ответ на вопрос

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

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