лучший способ определить маску

Я пишу функцию, которая должна извлечь из unsigned int отсроченные наборы битов.
Я хочу использовать маски для этого. Я не уверен, как лучше определить такие маски.
Например, мне нужно извлечь биты 6: 14. Поэтому мне нужно определить маску как 111111111 << 6,
Моя проблема в том, что я не могу использовать boost или что-то в этом роде, и стандартный c / c ++ не знает, как работать с двоичными числами.
Что можно сделать, это использовать 111111111 как 2 ^ 10-1. Я не уверен — это лучшее (самое элегантное) решение. Любые советы?

1

Решение

Просто используйте 0x1FF << 6 (если ты хочешь 111111111 << 6) или же 0x3FF
<< 6
(если хотите 2 ^ 10-1 << 6). Это значительно понятнее
чем ваш двоичный файл. Как отмечает Джерри Коффин, вы можете легко
получить 2 ^ 10 с помощью 1 << 10, но я не уверен, что это
понятнее, чем просто использование шестнадцатеричного числа. (В этом отношении,
в некоторых контекстах, 0x7FC00 может быть совершенно ясно. Она имеет
преимущество, которое вы видите визуально точно, где биты
одним словом, и легче выбрать их, если у вас есть гекс
дамп.)

1

Другие решения

Большинство людей используют шестнадцатеричные числа при представлении масок, таких как 0xFF, 0x0A и т. Д.

3

Давайте сначала попробуем сделать кучу из них.

Одно свойство последовательности из N единиц в двоичном коде состоит в том, что, как и последовательность девяток в десятичной системе, если вы добавите одну к ней, вы получите одну, за которой следует N нулей. Мы можем использовать обратное, тот факт, что если вы вычтете один из одного, за которым следуют N нулей, вы получите последовательность из N единиц, чтобы сделать это.

Один, за которым следуют N нулей, это просто 1 сдвинутый вправо N мест.

template <typename Uint>
Uint zigamorph(int n) { // http://catb.org/jargon/html/Z/zigamorph.html
return 1 << n - 1; // same as 2^n - 1 :)
}

Вооружившись зигаморфами любой длины, теперь вы можете легко получить нужные биты из любого значения, используя побитовые и.

template <typename Uint>
Uint mask_bits(Uint value, int first_bit, int last_bit) { // both inclusive?
return value & zigamorph<Uint>(last_bit-first_bit+1);
}
2

У вас есть доступ к стандартной библиотеке? Если так, я бы попробовал std::bitset

Вот это документация для этого.

1
По вопросам рекламы [email protected]