Как мне преобразовать число в двоичные биты, затем обрезать или увеличить их размер, а затем вставить в битовый контейнер?

Как следует из названия вопроса, я хочу взять число (объявленное предпочтительно как int или char или std::uint8_t), преобразовать его в двоичное представление, затем обрезать или дополнить его определенным переменным числом заданных битов, а затем вставить его в битовый контейнер (предпочтительно std::vector<bool>, потому что мне нужен переменный размер битового контейнера в соответствии с переменным количеством бит). Например, у меня int a= 2, b = 3. И скажем, я должен записать это как три бита и шесть бит соответственно в контейнер. Поэтому я должен поместить 010 и 000011 в битовый контейнер. Итак, как мне перейти от 2 к 010 или от 3 к 000011, используя обычные методы STL? Я перепробовал все возможные вещи, которые пришли мне в голову, но у меня ничего не вышло. Пожалуйста помоги. Спасибо.


person WDRKKS    schedule 11.04.2015    source источник


Ответы (1)


Вы можете использовать комбинацию «сдвига» (>>) и «побитового и» (&).

Сначала давайте посмотрим на побитовое &: например, если у вас есть int a=7 и вы выполняете над ним операцию & с 13, вы получите 5. Почему? Потому что & дает 1 в позиции i тогда и только тогда, когда оба операнда имеют 1 в позиции i. Итак, мы получаем:

  00...000111  // binary 7
& 00...001101  // binary 13
-------------
  00...000101  // binary 5

Затем, используя операцию сдвига >>, вы можете сдвинуть двоичное представление ваших int. Например, 5 >> 1 равно 2. Почему? Потому что каждая позиция смещается на 1 вправо. Самый правый бит "выпадает". Следовательно, мы имеем:

00...00101 //binary for 5
shift by 1 to the right gives:
00...00010 // binary for 2

Другой пример: 13 (01101) сдвинутое на 2 равно 3 (00011). Надеюсь, вы уловили идею.

Следовательно, многократно сдвигая и выполняя & с 1 (00..0001), вы можете прочитать двоичное представление числа.

Наконец, вы можете использовать этот 1, чтобы установить соответствующую позицию в вашем vector<bool>. Предполагая, что вы хотите иметь представление, которое вы показываете в своем посте, вам придется заполнить свой вектор сзади. Итак, вы могли бы, например, сделать что-то в этом роде:

unsigned int f=13; //the number we want to convert
std::vector<bool> binRepr(size, false); //size is the container-size you want to use.
for(int currBit=0; currBit<size; currBit++){
 binRepr[size-1-currBit] = (f >> currBit) & 1;
}

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

Я использую unsigned int, так как для int вам все равно придется позаботиться об отрицательных числах (для положительных чисел это должно работать так же), и нам придется погрузиться в представление дополнения до двух, что не сложно, но требует немного больше возни.

person dingalapadum    schedule 12.04.2015