Программирование >>  Инициализация объектов класса, структура 

1 ... 52 53 54 [ 55 ] 56 57 58 ... 395


cout << bitvec: вкченнхе биты:\n\t ; for ( int index = 0; index < 32; ++-index )

if ( bitvec[ index ] )

cout << index << ;

Значения битов с помощью индекса проверяются таким образом:

cout << endl;

bitvec.reset(0);

Следующая пара операторов демонстрирует сброс первого бита двумя способами:

bitvec[0] = 0;

Функции set() и reset() могут применяться ко всему битовому вектору в целом. В

сброс всех битов bitvec.reset(); if (bitvec.none() != true) что-то не сработало

установить в 1 все биты вектора bitvec

if ( bitvec.any() != true )

этом случае они должны быть вызваны без параметра. Например:

что-то опять не сработало

bitvec.f1ip( 0 ); меняет значение первого бита bitvec[0].flip(); тоже меняет значение первого бита

Функция flip() меняет значение отдельного бита или всего битового вектора:

bitvec.flip(); меняет значения всех битов

Существуют еще два способа определить объект типа bitset. Оба они дают возможность проинициализировать объект определенным набором нулей и единиц. Первый способ -явно задать целое беззнаковое число как аргумент конструктору. Начальные N позиций битового вектора получат значения соответствующих двоичных разрядов аргумента. Например:

bitset< 32 > bitvec2( Oxffff );

инициализирует bitvec2 следующим набором значений:

i 00000000000000001111111111111111

В результате определения



эквивалентно bitvec3

string bitva1( 1010 ); bitvec4 тем же набором значений, что и bitvec3:

bitset< 32 > bitvec4( bitval ); Mожно также указать диапазон символов строки, выступающих как начальные значения

подстрока с шестой позиции длиной 4: 1010 string bitval ( 1111110101100011010101 );

для битового вектора. Например:

bitset< 32 > bitvec5( bitval, 6, 4 ); Mi получаем то же значение, что и для bitvec3 и bitvec4. Если опустить третий

подстрока с шестой позиции до конца строки: 1010101 string bitva1( 1111110101100011010101 );

параметр, подстрока берется до конца исходной строки:

bitset< 32 > bitvec6( bitval, 6 );

Класс bitset предоставляет две функции-члена для преобразования объекта bitset в другой тип. Для трансформации в строку, состоящую из символов нулей и единиц, служит функция to string() :

string bitva1( bitvec3.to string() );

Вторая функция, to long() , преобразует битовый вектор в его целочисленное представление в виде unsigned long, если, конечно, оно помещается в unsigned long. Это видоизменение особенно полезно, если мы хотим передать битовый вектор функции на С или С++, не пользующейся стандартной библиотекой.

К объектам типа bitset можно применять побитовые операции. Например:

bitset<32> bitvec7 = bitvec2 & bitvec3;

Объект bitvec7 инициализируется результатом побитового И двух битовых векторов bitvec2 и bitvec3.

bitset< 32 > bitvec3( 012 ); у bitvec3 окажутся ненулевыми биты на местах 1 и 3:

i 00000000000000000000000000001010 I

В качестве аргумента конструктору может быть передано и строковое значение, состоящее из нулей и единиц. Например, следующее определение инициализирует



extern void bitstring(const char*); bool bit on (unsigned long, int); bitset<32> bitvec;

(a) bitsting( bitvec.to string().c str() );

(b) if ( bit on( bitvec.to 1ong(), 64 )) ...

Допущены ли ошибки в следующих операциях с битовыми векторами?

(c) bitvec.f1ip( bitvec.count() );

Упражнение 4.17

Дана последовательность: 1,2,3,5,8,13,21. Каким образом можно инициализировать объект bitset<32> для ее представления? Как присвоить значения для представления этой последовательности пустому битовому вектору? Напишите вариант инициализации и вариант с присваиванием значения каждому биту.

4.13. Приоритеты

Приоритеты операций задают последовательность вычислений в сложном выражении. Например, какое значение получит ival?

int ival = 6 + 3 * 4 / 2 + 2;

Если вычислять операции слева направо, получится 20. Среди других возможных результатов будут 9, 14 и 36. Правильный ответ: 14.

В С++ умножение и деление имеют более высокий приоритет, чем сложение, поэтому они будут вычислены раньше. Их собственные приоритеты равны, поэтому умножение и деление будут вычисляться слева направо. Таким образом, порядок вычисления данного выражения таков:

1. 3 * 4 => 12

2. 12 / 2 => 6

3. 6 + 6 => 12

4. 12 + 2 => 14

bitset<32> bitvecB = bitvec2 bitvec3;

Здесь bitvec8 инициализируется результатом побитового ИЛИ векторов bitvec2 и bitvec3. Точно так же поддерживаются и составные операции присваивания и сдвига.

Упражнение 4.15

Допущены ли ошибки в приведенных определениях битовых векторов?

(a) bitset<64> bitvec(32);

(b) bitset<32> bv( 1010101 );

(c) string bstr; cin >> bstr; bitset<8>bv( bstr );

(d) bitset<32> bv; bitset<16> bvl6( bv ); Упражнение 4.16



1 ... 52 53 54 [ 55 ] 56 57 58 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика