Поразрядные операции позволяют работать с данными на уровне бит. Все поразрядные операции и int, short, long, unsigned char, unsigned int, unsigned long int, ...).
Существует 6 поразрядных операций
| Операция | Описание | |
|---|---|---|
| поразрядное И | Бит результата устанавливается в 1, если соответствующие биты обоих операндов равны 1 | |
| | | поразрядное ИЛИ | Бит результата устанавливается в 1, если соответствующий бит хотя бы одного операнда равен 1 |
| ^ | Поразрядное ИСКЛЮЧАЮЩЕЕ ИЛИ | Бит результата устанавливается в 1, если соответствующий бит одного и только одного операнда равен 1 |
| ~ | поразрядное НЕ | |
| << | Поразрядный сдвиг влево | Сдвигает биты первого операнда влево на количество позиций, заданных вторым операндом. При этом освобождающиеся справа биты заполняются нулями |
| >> | Поразрядный сдвиг вправо | Сдвигает биты первого операнда вправо на количество позиций, заданных вторым операндом. При этом освобождающиеся слева биты заполняются нулями |
Приведем примеры
#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.2 ) Применение объединения для выделения байтов #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;
}
}
| = | Операция присваивания поразрядного И |
| | = | Операция присваивания поразрядного ИЛИ |
| ^ = | Операция присваивания поразрядного исключающего ИЛИ |
| << = | Операция присваивания сдвига влево |
| >> = | Операция присваивания сдвига вправо |
#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;
}
}
Результат работы программы
Весь байт заполнен единицами 11111111 Битовые поля: field3[4]-field2[1]-field1[3] Обнулили поле field1 длиной 3 бита 11111000 Обнулили поле field2 длиной 1 бит 11110111 Обнулили поле field3 длиной 4 бита 00001111
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.