operator»
|
Cout «
|
fourBits;
|
|
Передает строку в объект класса bitset
|
operators
|
"0101" »
|
fourBits;
|
Выполняет побитовую операцию AND
|
operator|
|
bitset <4>
|
result
|
(fourBitsl & fourBits2);
|
Выполняет побитовую операцию OR
|
operatorA
|
bitwise
|
<4>
|
result
|
(fourBitsl | fourBits2);
|
Выполняет побитовую операцию XOR
|
operator^
|
bitwise
|
<4>
|
result
|
(fourBitsl А fourBits2);
|
Выполняет побитовую операцию NOT
|
operator»=
|
bitwise
|
<4>
|
result
|
(^fourBitsl);
|
Выполняет бинарный оператор сдвига вправо
|
operator«=
|
fourBits
|
» =
|
(2);
|
// Сдвиг на два бита вправо
|
Выполняет бинарный оператор сдвига влево
|
operator [N]
|
fourBits
|
« =
|
(2) ; // Сдвиг на два бита влево
|
Возвращ ает ссылку на бит номер N в последовательности
|
|
fourBits
|
[2]
|
=0;
|
// установить третий бит в 0
|
|
bool bNum = fourBits [2]; // читать третий бит
|
В дополнение к ним класс s t d : : b i t s e t предоставляет такие операторы, как | =, &=, л= и ~=, позволяющие выполнять бинарные операции.
Методы класса std: :bitset
Биты могут находиться в двух состояниях: они либо установлены (1), либо сброшены (0). Для манипулирования содержимым набора битов можно воспользоваться функциями-членами класса b i t s e t (табл. 25.2), позволяющими работать с некоторыми или со всеми битами в наборе.
Т А Б Л И Ц А 2 5 .2 . Методы класса std::bitset
Оператор
Set
s e t ( N , val=l)
Reset
reset (N)
Описание
Устанавливает все биты последовательности в 1
fourBits.set (); // теперь набор содержит: '1111'
Устанавливает в бит номер означение val (по умолчанию 1)
fourBits.set (2, 0); // установить третий бит в 0
Сбрасы вает все биты последовательности в 0
fourBits.reset (); // теперь набор содержит: '0000'
Сбрасывает бит номер N
fourBits.reset (2); // теперь третий бит 0
Оператор
Flip
Size
Count
Использование класса std::bitset и его членов
|
565
|
Окончание табл. 25.2
Описание
Инвертирует все биты последовательности
fourBits.flip (); // 0101 измененилось на 1010
Возвращ ает количество битов последовательности
size_t NumBits = fourBits.size О; // возвращает 4
Возвращ ает количество установленных битов
size_t NumBitsSet = fourBits.count ();
size t NumBitsReset = fourBits.size () - fourBits.count ()
Применение этих методов и операторов демонстрирует листинг 25.2.
ЛИСТИНГ 25.2. Логические операции с набором битов
#include
#include
2 : #include
3:
int main ()
{
6 : using namespace std;
bitset <8> inputBits;
8:
|
cout
|
«
|
"Enter
|
a
|
8-bit sequence: ";
|
|
9:
|
cin
|
»
|
inputBits;
|
// сохранить пользовательский
|
1 0 :
|
1 1 :
|
|
|
|
|
//
|
ввод в наборе
|
битов
|
cout
|
«
|
"Number
|
of Is
|
you supplied:
|
" « inputBits.count ()
|
1 2 :
|
endl;
cout « "Number of Os you supplied: ";
cout « inputBits.size () - inputBits.count () « endl;
bitset <8> inputFlipped (inputBits); // копирование
17:
|
inputFlipped.flip
|
();
|
// инверсия
|
битов
|
18:
|
cout
|
«
|
"Flipped version
|
is: " « inputFlipped
|
«
|
endl;
|
19:
|
2 0 :
|
cout
|
«
|
"Result of AND,
|
OR and XOR between the
|
two:" « endl;
|
2 1 :
|
2 2 :
|
cout
|
«
|
inputBits
|
« " & " « inputFlipped «
|
" =
|
";
|
cout « (inputBits & inputFlipped) « endl; // побитовое AND
cout « inputBits « " | " « inputFlipped « " = ";
26: cout « (inputBits | inputFlipped) « endl; // побитовое OR
27:
cout « inputBits « " л " « inputFlipped « " = ";
cout « (inputBits л inputFlipped) « endl; // побитовое XOR
return 0;
}
566 ЗАНЯТИЕ25.Работасбитовымифлагамиприиспользованиибиблиотеки5Т1-
Результат
Enter a 8-bit sequence: 10110101
Number of Is you supplied: 5
Number of Os you supplied: 3
Flipped version is: 01001010
Result of AND, OR and XOR between the two:
10110101 & 01001010 = 00000000
10110101 | 01001010 = 11111111
10110101 A 01001010 = 11111111
Анализ
Эта интерактивная программа демонстрирует не только простые бинарные операции между двумя последовательностями битов с использованием класса s t d : i b i t s e t , но и удобство его потоковых операторов. Операторы сдвига ( » и « ) , реализованные клас сом s t d : : b i t s e t , позволяют записывать последовательности битов на экран и читать небольшие последовательности, введенные пользователем в командной строке. Набор би тов i n p u t B i t s получает введенную пользователем последовательность (строка 10). И с пользуемый в строке 12 метод c o u n t () сообщает количество единиц в последовательно сти, а количество нулей вычисляется как разница между результатами выполнения метода s i z e (), возвращающего количество битов в наборе битов, и метода c o u n t (), как показа но в строке 14. Набор битов in p u tF lip p e d , изначально копия набора битов in p u t B i t s , впоследствии инвертируется с использованием метода f l i p () в строке 17. Теперь он со держит последовательность инвертированных битов, т.е. нули стали единицами, а едини цы нулями. Остальная часть программы демонстрирует результат побитовых операций AND, OR и XOR между этими двумя наборами битов.
Одним из недостатков шаблона класса bitseto библиотеки STL является его неспособность изменять свои размеры динамически. Вы можете использовать класс bitset только там, где количество хранимых в последовательности би тов известно во время компиляции.
Библиотека STL снабжает программиста классом vector (называе мым также bit_vector в некоторых реализациях библиотеки STL), который преодолевает этот недостаток.
Класс vector
Класс v e c to r < b o o l> является частичной специализацией класса s t d : : v e c to r , пред назначенной для хранения логических данных. Этот класс в состоянии динамически из мерить свой размер. Поэтому программист может не заботиться о количестве логических флагов во время компиляции.
СОВЕТ Чтобы использовать класс std:: ector, включите его заголовок:
#include
Создание экземпляра класса vector
Экземпляр класса v e c to r < b o o l> создается подобно вектору:
vector vecBooll;
Например, можно создать вектор с 10 логическими значениями, для начала инициали зированных значением 1 (т.е. tr u e ) :
vector vecBool2 (10, true);
Вы можете также создать объект как копию другого:
vector vecBool2Copy (vecBool2);
Некоторые из способов создания экземпляра класса v e c to r < b o o l> представлены в листинге 25.3.
ЛИСТИНГ 2S.3. Создание экземпляра класса vector< bool> ________________________________
#include
1:
int main ()
{
using namespace std;
// Создать экземпляр объекта, используя стандартный конструктор
vector vecBooll;
:
// Инициализировать вектор из 10 элементов значением true
10: vector vecBool2 (10, true);
1 1 :
// Создать экземпляр объекта как копию другого
13: vector vecBool2Copy (vecBool2);
14:
return 0;
}
Анализ
Этот пример демонстрирует некоторые из способов создания объекта класса v e c to r< b o o l> . В строке 7 используется стандартный конструктор. В строке 10 показано создание объекта, который изначально содержит 10 логических флагов, инициализирован ных значением t r u e . Строка 13 демонстрирует, как один объект класса v e c to r < b o o l> может быть создан как копия другого.
Функции и операторы класса vector
Класс v e c to r< b o o l> предоставляет функцию f l i p (), которая инвертирует состояние логических значений в последовательности, подобно функции b i t s e t o : : f l i p ().
остальном этот класс очень похож на класс s t d : : v e c t o r в том смысле, что можно применить функцию p u sh _ b a c k () к флагам последовательности. Пример в листинге 25.4 демонстрирует применение этого класса в подробностях.
568 ЗАНЯТИЕ25.Работасбитовымифлагамиприиспользованиибиблиотеки8И
ЛИСТИНГ 25.4. Использование класса vector__________________________
8>8>4>4>4>4>
Do'stlaringiz bilan baham: |