2015-04-11 4 views
1

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

ответ

1

Вы можете использовать комбинацию 'shifting' (>>) и 'bit-wise and' (&).

Сначала давайте посмотрим на побитового &: Например, если у вас есть int a=7 и вы делаете & -operation на нем с 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; 
} 

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

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