is_реклам:

пошук, категорії та ін. показати ▼

масиви бітів та розрядні матриці

масиви бітів та розрядні матриці
автор опубліковано

Будь-яке число можна записати в двійковій системі числення у вигляді послідовності нулів та одиниць. Наприклад, будь-яке шістнадцяти розрядне число складається з 16 двійкових цифр — 0 та 1. Ми можемо використовувати одне число для збереження шістнадцяти різних станів — прапорців. Нам не потрібно витрачати місце на збереження 16 різних змінних, адже для опису стану (увімкнено / вимкнено) цілком достатньо 1 біта. Змінна, що використовується для збереження прапорців, називається розрядною матрицею або масивом бітів.

Високорівневі мови програмування також використовують розрядні матриці, наприклад, при збереженні набору значень ПЕРЕЧИСЛЕННЯ, для економії пам'яті. Думаю, всі знайомі з однією розрядною матрицею, яка дуже часто використовується в програмуванні — це регістр признаків мікропроцесора. Ми будемо дуже часто контактувати з розрядними матрицями при програмуванні різних пристроїв: видеоадаптера, звукової плати і т.д. В цьому випадку зміна одного біта в розрядній матриці може змінити режим роботи пристрою.

Для зміни значення окремих бітів в матриці служать логічні операції. Перший операнд задає розрядну матрицю, з якою ми будемо працювати, а другий операнд задає так звану маску, що використовується для вибору окремих бітів.

Для встановлення певних бітів масива в одиницю (всі інші біти при цьому повинні залишитися без змін) використовується команда OR. В якості маски візьміть двійкове число, в якому одиниці стоять на місці тих бітів, які Ви хочете встановити в масиві. Наприклад, якщо Ви хочете встановити перший і останній біти масиву, Ви маєте використовувати маску 10000001. Всі інші біти залишаться такими, як були, оскільки 0 OR X завжди повертає X.

Щоб скинути деякі біти (встановити їх значення в 0), візьміть в якості маски число, в якому нулі стоять на місці тих бітів, які Ви хочете скинути, а одиниці — у всіх інших позиціях, а потім використайте команду AND. Оскільки 1 AND X завжди повертає X, ми скинемо тільки необхідні нам біти.

Розглянемо декілька прикладів.

Приклад 1. В регістрі AL завантажено масив бітів. Потрібно встановити всі непарні позиції в 1. Попередній стан масиву невідомий.

or al, 10101010b ; маска, яка встановлює всі непарні біти в 1

Приклад 2. В масиві бітів, що зберігається в регістрі AL, скинути 0-й і 7-й біти, всі інші залишити без змін. Вихідний стан масиву також невідомий.

and al, 01111110b ; кожна 1 в масці зберігає біт в її позиції

За допомогою XOR також можна змінювати значення бітів, не знаючи попереднього стану. Для цього в масці встановіть 1 для кожного біта, який Ви хочете інвертувати (0 стане 1, а 1 стане 0), а для всіх інших бітів встановіть 0. Якщо ми виконаємо XOR двічі, отримаємо вихідне значення. Така поведінка операції XOR дозволяє використовувати цю команду для простого шифрування: до кожного байту даних, що шифруються, застосовується XOR з постійною маскою (ключем), а для дешифрування той самий ключ застосовується (XOR) до зашифрованих даних.

схоже за тегами

Залишити коментар:

Яндекс цитирования UA TOP Bloggers