Порозрядні операції (їх ще називають побітовими чи просто бітовими) виконуються тільки над операндами цілих типів. До них належать (згідно з порядком старшинства операції):
1) ~ (побітова інверсія, унарна операція);
2) << (зсування вліво), >> (всування вправо);
3) & (побітове AND);
4) ^ (побітове XOR);
5) | (побітове OR).
Використання порозрядних операцій дає змогу оперувати окремими бітами даних, перевіряти або змінювати їх значення, що наближає програмування мовою С++ до можливостей асемблера.
Порозрядні операції виконуються окремо над кожною парою бітів, що записані в однакових за номером розрядах двох операндів, які вступають в порозрядну операцію. Таблиця істинності порозрядних операцій наведена в табл. 4.2.
Таблиця 4.2. Таблиця істинності порозрядних операцій
Розряди
| Результат операції
|
ai
| bi
| AND
| XOR
| OR
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Операцію & називають накладанням маски, оскільки вона дає змогу виділити потрібні розряди цілочислового операнда. Наприклад, необхідно визначити значення першого біту числа. В масці в першому біті записуємо одиницю, в інших бітах – нуль. При виконанні операції & значення першого біту буде збережено, значення всіх інших – замінені на нуль.
Операцію | можна використовувати для встановлення одиниці в потрібних розрядах числових даних. Для цього в масці встановлюємо одиницю в позиціях, де її необхідно встановити, і нулі в позиціях, значення в яких необхідно залишити незмінними.
Операції << i >> зсувають усі розряди цілочислового операнда, заданого зліва від знака операції, на кількість бітів, вказану справа від знака операції.
У разі зсування вліво старші біти, які виходять за межі розрядної сітки числа, втрачаються, а на місце молодших бітів, що звільняються після зсування, заносять нулі. При зсуванні вправо втрачаються молодші розряди числа, які зсуваються за межі розрядної сітки. Заповнення звільнених старших розрядів залежить від типу даного: якщо операнд без знаковий (оголошений з модифікатором unsigned), то вільні старші розряди заповнюються нулями. Якщо праворуч зсувається знакове число, то для заповнення вільних розрядів використовується біт знака.
Проілюструємо використання побітових операцій такою програмою:
#include <iostream>
using namespace std;
void print_bin(unsigned char x) {
unsigned char mask = 1 << 7;
while (mask) {
cout << (x & mask ? 1 : 0);
mask >>= 1;
}
cout << endl;
}
int main(){
unsigned char a = 240;
unsigned char b = 170;
cout << "a "; print_bin(a); // 11110000
cout << "b "; print_bin(b); // 10101010
cout << "a & b "; print_bin(a & b); // 10100000
cout << "a | b "; print_bin(a | b); // 11111010
cout << "a ^ b "; print_bin(a ^ b); // 01011010
cout << "~a "; print_bin(~a); // 00001111
}