Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет: Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.
Как активировать код? |
Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1446 / 158 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Тема: Программирование
Специальности: Программист, Архитектор программного обеспечения
Теги:
Лекция 19:
Поразрядные операции C++ и битовые поля
< Лекция 18 || Лекция 19 || Лекция 20 >
Аннотация: В данной лекции описываются поразрядные операции C++, битовые поля и примеры их использования.
Поразрядные операции позволяют работать с данными на уровне бит. Все поразрядные операции и битовые поля используются только с целыми типами данных разных вариаций ( int, short, long, unsigned char, unsigned int, unsigned long int, ...).
Существует 6 поразрядных операций
Приведем примеры
#include "stdafx.h" #include <iostream> #include <tchar.h> #include <windows.h> #include <stdlib.h> using namespace std; // Печать двоичного представления целого без знака void displayBits(unsigned); char str[100]; int _tmain(int argc, _TCHAR* argv[]) { unsigned int x; // void displayBits(unsigned); // Можно и здесь объявить, // но лучше вначале файла char ch; do{ CharToOem("Введите целое без знака (q - выход): ", str); cout << str; cin >> x; displayBits(x); ch = getchar(); } while(tolower(ch) != 'q'); return 0; } //********************************************************** void displayBits(unsigned value) { unsigned pos, mask = 1, maxBits = sizeof(unsigned) * 8; mask <<= maxBits - 1; // Загнали единицу в старший разряд for(pos = maxBits; pos > 0; pos--) { if(pos % 8 == 0) cout << ' '; // Через восемь разрядов - отступ cout << (value & mask ? '1' : '0'); // Вывод по маске mask >>= 1; // value <<= 1; } cout << endl << endl; }Листинг 19.1 . Печать двоичного представления типа unsigned
#include "stdafx.h" #include <iostream> #include <tchar.h> #include <windows.h> #include <stdlib.h> using namespace std; // Печать двоичного представления целого без знака void displayByte(unsigned char); char str[100]; int _tmain(int argc, _TCHAR* argv[]) { union{ unsigned int word; unsigned char byte[sizeof(int)]; }; char ch; do{ CharToOem("Введите целое без знака (q - выход): ", str); cout << str; cin >> word; for(int i = sizeof(int); i > 0 ; i--) { displayByte(byte[i - 1]); } cout << endl << endl; ch = getchar(); } while(tolower(ch) != 'q'); return 0; } //********************************************************** void displayByte(unsigned char value) { unsigned char pos, mask = 1, countBits = sizeof(unsigned char) * 8; mask <<= countBits - 1; // Загнали единицу в старший разряд for(pos = countBits; pos > 0; pos--) { if(pos % 8 == 0) cout << ' '; // Через восемь разрядов - отступ cout << (value & mask ? '1' : '0'); // Вывод по маске mask >>= 1; // value <<= 1; } }Листинг 19.2 . Применение объединения для выделения байтов
& = | Операция присваивания поразрядного И |
| = | Операция присваивания поразрядного ИЛИ |
^ = | Операция присваивания поразрядного исключающего ИЛИ |
<< = | Операция присваивания сдвига влево |
>> = | Операция присваивания сдвига вправо |
#include "stdafx.h" #include <iostream> #include <tchar.h> #include <windows.h> #include <stdlib.h> using namespace std; // Битовые поля void displayBits(unsigned char); char str[100]; int _tmain(int argc, _TCHAR* argv[]) { Union { unsigned char byte; struct{ unsigned char field1 : 3; unsigned char field2 : 1; unsigned char field3 : 4; }; }; CharToOem("Весь байт заполнен единицами\n", str); cout << str; byte = 0xFF; displayBits(byte); // Печатать заполненный байт CharToOem("\n\nБитовые поля: field3[4]-field2[1]-field1[3]\n", str); cout << str; CharToOem("\nОбнулили поле field1 длиной 3 бита\n", str); cout << str; field1 = 0; displayBits(byte); // Печатать измененный байт cout << endl; byte = 0xFF; // Восстановили байт CharToOem("\nОбнулили поле field2 длиной 1 бит\n", str); cout << str; field2 = 0; displayBits(byte); // Печатать измененный байт cout << endl; byte = 0xFF; // Восстановили байт CharToOem("\nОбнулили поле field3 длиной 4 бита\n", str); cout << str; field3 = 0; displayBits(byte); // Печатать измененный байт cout << endl; getchar(); // Задержать экран return 0; } //********************************************************** void displayBits(unsigned char value) { unsigned char pos, mask = 1, countBits = sizeof(unsigned char) * 8; mask <<= countBits - 1; // Загнали единицу в старший разряд for(pos = countBits; pos > 0; pos--){ if(pos % 8 == 0) cout << ' '; // Через восемь разрядов - отступ cout << (value & mask ? '1' : '0'); // Вывод по маске mask >>= 1; // value <<= 1; } }Листинг 19.3 . Битовые поля
Результат работы программы
Весь байт заполнен единицами 11111111 Битовые поля: field3[4]-field2[1]-field1[3] Обнулили поле field1 длиной 3 бита 11111000 Обнулили поле field2 длиной 1 бит 11110111 Обнулили поле field3 длиной 4 бита 00001111
< Лекция 18 || Лекция 19 || Лекция 20 >