|
Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет: Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.
Как активировать код? |
Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 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 >


