Demo
Для чтения/выберите биты в определенных позициях вы должны скрывать, или маски, остальные биты. Одним из способов достижения этого является побитовый оператор AND: &
(не логический и, &&
).Если предположить, что речь идет о ряде 8 бит, если вход 15 и маска 7, результат 7:
Input: decimal 15 as binary: 0000 1111 &
Mask: decimal 7 as binary: 0000 0111
------------------------------------------
Output: decimal 7 as binary: 0000 0111
Ваша проблема на самом деле, чтобы найти правильную маску. Если вас просят за последние 4 бита, ваша маска должна быть 0000 1111
(15 десятичных знаков, F гекса). Если вас просят за последние две цифры, ваша маска должна быть 0000 0011
(3 десятичных, 3 гекса). Шаги, чтобы найти маску для последних п битов:
- Установить все биты в 1. Это может быть сделано путем отрицая нуля:
~0
->1111 1111
(255 десятичное, FF гекса)
- Сдвиг
n
бит влево : ~0 << n
. Если n равно 2, вы получите 1111 1100
- Отклонить результат:
~(~0 << n)
. Если n равно 2, вы получите 0000 0011
.
После того, как у вас есть маска, все, что вам нужно сделать, это использовать побитовое И:
output = input & ~(~0 << n)
Это то, что вы получите в конце:
unsigned get_last_n_bits(unsigned u, int n)
{
return u & ~(~0U << n);
}
При отображении результат в двоичной базе невозможен с помощью стандартных ручных манипуляторов. Вы не можете написать что-то похожее на cout << hex << number
: нет манипулятора bin
. Тем не менее, он может быть отображен, если число преобразуется в bitset
: cout << bitset<width>(number)
:
#include <iostream>
#include <bitset>
using namespace std;
unsigned get_last_n_bits(unsigned u, int n)
{
return u & ~(~0U << n);
}
int main()
{
cout << bitset<8>(get_last_n_bits(254, 2)); // displays 00000010
return 0;
}
Читайте о побитовом И. – ZDF
Да, вы правы, Извините –