Поля бітів – це особливий вид елементів структур та об’єднань. Такі поля складаються з послідовних бітів, записаних в дане цілого типу. Поля бітів застосовують, коли необхідно мати доступ до окремих бітів всередині байта або слова даних. Оголошення поля бітів виконується через таку синтаксичну конструкцію:
тип_поля ім’я_бітового_поля : розмір_поля;
де тип може бути тільки типом int з допоміжними специфікаторами unsigned i signed; ім’я бітового поля – звичайний ідентифікатор; розмір поля – ціле число, яке задає ширину поля в бітах. Доступ до поля здійснюється по імені. Адресу поля отримати не можна, в іншому поля бітів використовуються так само, як поля структур.
Виведемо на екран двійкове представлення числа, використовуючи поля бітів і маску.
#include <iostream>
using namespace std;
int main() {
union binary {
char value;
struct {
unsigned a0 : 1;
unsigned a1 : 1;
unsigned a2 : 1;
unsigned a3 : 1;
unsigned a4 : 1;
unsigned a5 : 1;
unsigned a6 : 1;
unsigned a7 : 1;
} byte;
};
binary t;
t.value = 15;
cout << t.byte.a7 << t.byte.a6 << t.byte.a5 << t.byte.a4;
cout << t.byte.a3 << t.byte.a2 << t.byte.a1 << t.byte.a0;
int a = 15, m = 1;
for ( m = 128; m; m >>= 1 )
if ( a & m ) cout << "1";
else cout << "0";
}
Використаємо поля бітів для простого шифрування – будемо міняти місцями три перші і три останні біта символу.
#include <iostream>
using namespace std;
int main() {
union code {
char value;
struct {
unsigned int lbt : 3;
unsigned int mbt : 2;
unsigned int hbt : 3;
};
};
code t1, t2;
const int N = 10;
char c1[ N ] = "Hello", c2[ N ] = "", c3[ N ] = "";
c1[ N - 1 ] = c2[ N - 1 ] = c3[ N - 1 ] = '\0';
// Шифруємо рядок символів
for ( int i = 0; i < N - 1; i++ ) {
t1.value = c1[ i ];
t2.lbt = t1.hbt;
t2.hbt = t1.lbt;
t2.mbt = t1.mbt;
c2[ i ] = t2.value;
}
// Дешифруємо рядок символів
for ( int i = 0; i < N - 1; i++ ) {
t1.value = c2[ i ];
t2.lbt = t1.hbt;
t2.hbt = t1.lbt;
t2.mbt = t1.mbt;
c3[ i ] = t2.value;
}
// Виводимо результат у вигляді рядків символів і
// в двійковому вигляді
cout << c1 << endl;
cout << c2 << endl;
cout << c3 << endl;
for ( int i = 0; i < N - 1; i++ ) {
for ( int m = 128; m; m >>= 1 )
if ( c1[ i ] & m ) cout << "1";
else cout << "0";
cout << " ";
}
cout << endl;
for ( int i = 0; i < N - 1; i++ ) {
for ( int m = 128; m; m >>= 1 )
if ( c2[ i ] & m ) cout << "1";
else cout << "0";
cout << " ";
}
cout << endl;
for ( int i = 0; i < N - 1; i++ ) {
for ( int m = 128; m; m >>= 1 )
if ( c3[ i ] & m ) cout << "1";
else cout << "0";
cout << " ";
}
}