Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1435 / 157 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 19:

Поразрядные операции C++ и битовые поля

< Лекция 18 || Лекция 19 || Лекция 20 >
Аннотация: В данной лекции описываются поразрядные операции C++, битовые поля и примеры их использования.

Поразрядные операции позволяют работать с данными на уровне бит. Все поразрядные операции и битовые поля используются только с целыми типами данных разных вариаций ( int, short, long, unsigned char, unsigned int, unsigned long int, ...).

Существует 6 поразрядных операций

Таблица 19.1.
Операция Описание
& поразрядное И Бит результата устанавливается в 1, если соответствующие биты обоих операндов равны 1
| поразрядное ИЛИ Бит результата устанавливается в 1, если соответствующий бит хотя бы одного операнда равен 1
^ Поразрядное ИСКЛЮЧАЮЩЕЕ ИЛИ Бит результата устанавливается в 1, если соответствующий бит одного и только одного операнда равен 1
~ поразрядное НЕ Унарная операция, которая применяется только к одному операнду. Меняет каждый бит с 1 на 0 и наоборот
<< Поразрядный сдвиг влево Сдвигает биты первого операнда влево на количество позиций, заданных вторым операндом. При этом освобождающиеся справа биты заполняются нулями
>> Поразрядный сдвиг вправо Сдвигает биты первого операнда вправо на количество позиций, заданных вторым операндом. При этом освобождающиеся слева биты заполняются нулями

Приведем примеры

#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 . Применение объединения для выделения байтов
Таблица 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 >
Максим Филатов
Максим Филатов

Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет:

Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.

 

Как активировать код?