|
Программирование >> Инициализация объектов класса, структура
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
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |