Бітовий операції в c # (частина 1)

Бітовий операції в C # (Частина 1)

Бітовий операції в c # (частина 1)

бітові операції

У цій статті, я розповім і покажу на практиці як і коли можна використовувати бітові операції в програмах, написаних на C #. Насправді, роботу з бітовими операціями можна віднести до низкоуровневой роботі, і C # програмісти досить рідко відчувають подібну необхідність. Адже дійсно, більшість завдань можна вирішити більш витонченими способами, але бувають випадки, коли використання бітових операцій просто необхідно.

Наприклад, в моїй практиці, доводилося стикатися з необхідністю контролювати стан зовнішньої системи. Ось уявіть, у Вас є якась система, що складається з восьми блоків, і Ви повинні постійно моніторити стан цієї системи. Або навіть так, система сама, періодично відправляє в інтерфейс зв'язку зі «зовнішнім світом» інформацію про свій стан, а Ви підключилися до цього інтерфейсу і обробляєте отримані дані. Так ось, система відправляє стан по кожному своєму блоку, причому стан блоку може бути висловлено двома значеннями: блок працює і блок не працює. А інформація передається не по кожному блоку окремо (у вигляді логічних так / ні, що виражає стан блоку) а по всім блокам відразу, у вигляді одного байта (восьмібітного числа), де кожен біт поєднана зі станом певного блоку.

Розряди чисел (в тому числі і виконавчі, тобто біти) прийнято нумерувати начина з молодшого (найправішого, в звичній записи). При чому, молодшому розряду прийнято давати номер «0», наступний буде мати номер «1», потім буде «2» і т.д. Ось приклад числа в двійковій запису: 01101111, де старший біт (біт №7) дорівнює «0», а молодший (біт №0) дорівнює «1».

Нехай молодший біт співвідноситься зі станом першого блоку (або блоку з індексом «0»), а старший - з восьмим блоком (або блоком з індексом «7»). Тоді, якщо молодший біт (найправіший в звичному написанні числа) встановлено в «1», то ми вважаємо що перший блок працює, а якщо біт скинутий в «0», то вважаємо, що блок не працює. Таким чином, якщо система вирішить повідомити нам що працюють всі блоки крім другого і четвертого, вона надішле таке значення: 245 в десятковій системі числення, або 11110101 - в двійковій.

Так ось, отримати це число ми отримаємо, але його потрібно ще проаналізувати, тут нам і допоможуть бітові операції. В даному випадку, для отримання стану певного блоку, нам потрібно «рахувати» конкретний розряд, тобто дізнатися значення певного біта (чому воно рано, «о» або «1»). Виконується це завдання за допомогою операції побітового «І» (в C # позначається як «»), шляхом накладення бітової маски на отримане число: [отримане число] [Бітова маска]. Бітова маска - це теж, якесь число, яке ми підбираємо певним чином. А що б зрозуміти, як правильно підібрати бітову маску, ми повинні розуміти, як працює операція побітового «І». А працює вона в такий спосіб, порівнюються відповідні біти обох чисел (тобто нульовий біт порівнюється з нульовим бітом іншого, перший - з першим, другий - з другим), і побитово формується результат, у вигляді третього числа. Причому, якщо відповідний біт першого числа дорівнює «1» і відповідний біт другого числа дорівнює «1», то і в результуючим числі відповідний біт буде дорівнює «1», а у всіх інших випадках, в результаті буде «0». І так перебираються всі біти обох чисел, і формується результат.

Наприклад, накладення маски 110000011 на число 11110011, тобто (11110011 110000011) дасть результат 11000011.

Так як же дізнатися значення потрібного нам біта? Так легко, потрібно сформувати бітову маску так, що б потрібний по порядку біт (наприклад, наймолодший) дорівнював «1», а всі інші біти маски були рівні «0». Після цього, потрібно накласти маску на число за допомогою операції «», і якщо результат буде дорівнює «0», то в початковому числі, що цікавить біт дорівнює «0», в іншому випадку (якщо результат відмінний від нуля), біт встановлений в « 1 ».

Використовуючи ці знання, давайте напишемо клас, об'єкти якого будуть зберігати числа отримані від зовнішньої системи і за запитом (обігу до потрібного властивості), повертати стан цікавить блоку у вигляді логічного значення true / false. Виглядати такий клас може приблизно так:

Запис виду 0x01 означає, що ми вказали число в шістнадцятковій системі числення. Якщо ми хочемо задати значення числа в шістнадцятковій формі, то ми повинні додати префікс «0x» перед числом (так само, можна вказувати провідні нулі).

Тепер, якщо ми створимо об'єкт класу «StateController» із зазначенням числа отриманого від системи, наприклад, нехай це буде число 26 (в десятковій системі), то викликавши властивість «Unit1State», ми побачимо, що перший блок не працює:

У цій статті, я розповів про те, як отримувати значення конкретних бітів числа! У наступній статті, я продовжу розповідати про бітові операції в C # (обговоримо установку значень конкретним бітам числа).

Схожі статті