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