Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 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. Ввожу код на сайте, пишет:

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

 

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

Денис Пашков
Денис Пашков
Россия
Татьяна Ковалюк
Татьяна Ковалюк
Украина, Киев, Киевский политехнический институт, 1974