Які переваги використання побітових операцій? [зачинено]


19

Після прочитання останнього бюлетеня CodeProject я натрапив на цю статтю про побитові операції . Це робить цікавим читання, і я, безумовно, бачу перевагу перевірки, чи є ціле число парним чи непарним, але перевіряє, чи встановлено n-й біт? У чому можуть бути переваги цього?

Відповіді:


27

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

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

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

Я вже декілька років працюю із супутниковою системою зв'язку, де корисна навантаження повідомлень становить 10,5 байт. Щоб найкраще використовувати цей пакет даних, інформація повинна бути упакована в блок даних, не залишаючи невикористаних бітів між полями. Це означає широко використовувати бітові та зсувні оператори для отримання значень інформації та упаковки їх у корисне навантаження, що передається.


4
Для тих, хто цікавиться більш булевими розрядними операціями та оптимізаціями, ознайомтеся із захопленням Hacker: amazon.com/Hackers-Delight-Henry-S-Warren/dp/0201914654
габлін

7

В основному, ви їх використовуєте через розміри та швидкість. Бітові операції неймовірно прості і, отже, зазвичай швидші, ніж арифметичні операції. Наприклад, щоб отримати зелену частину значення rgb, арифметичний підхід є (rgb / 256) % 256. З побітними операціями ви зробили б щось (rgb >> 8) & 0xFF. Останнє значно швидше, і коли ви звикли до нього, це також простіше. Як правило, бітові операції вступають у гру, коли вам потрібно кодувати / декодувати дані компактно і швидко.


2
BYTE g1 = (rgb / 256) % 256; 00E51013...C1 E9 08...shr ecx,8 00E51016...88 0C 24...mov byte ptr [esp],cl
rwong

4

Такі операції часто використовуються при написанні для вбудованих систем, де пам'ять або процесорне живлення обмежені.

Наприклад, щоб заощадити простір, ви можете зберігати кілька змінних в одній 8-бітовій змінній int, використовуючи кожен біт для подання булевого значення. Тоді вам потрібен швидкий спосіб встановити певний біт або отримати значення біта.

Як правило, програмування на мовах вищого рівня, таких як C # на настільному ПК з гігабайт пам'яті, вам не дуже важливо, щоб кожен bool займав цілий байт . Але якщо ви програмуєте мікроконтролер на C з 2 кб пам'яті, кожен біт рахується, тому можливість упаковки 8 болів в один байт може бути критичною.


.NET має [Flags]атрибут, який дозволяє використовувати Enumбітове поле. Наприклад, Fontмає Styleвластивість, яка є бітовим полем, що містить жирний, курсивний, підкреслений і закреслений.
deltreme

@deltreme. Так, я знаю, що ви можете використовувати [Прапори], але це не в цьому. Справа в тому, що в мовах високого рівня ви не дуже дбаєте про використання декількох байтів простору для пари булів. Ви, як правило, більше дбаєте про технічне обслуговування та читаність коду. У вбудованих системах, де вам важливо розмір, у вас немає доступу до таких речей, як атрибут .net [Flags], тож саме там ви можете використовувати ці побізні операції.
Simon P Stevens

"але тестування, якщо встановлено n-й біт? Що, можливо, може бути перевагами цього?" тож справа в тому, але оскільки мова не була вказана, я вирішив ввести її як коментар до відповіді, де згадується C #. Це не коментар до вашої відповіді, це доповнення, або приємно знати, чи будь-що інше.
deltreme

@deltreme: О, здорово.
Саймон П Стівенс

3

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

Фактично, MPEG 4 навіть використовує експоненціальне кодування Golomb для полів змінної бітової довжини. Значення, яке було останнім пакетом шириною 17 або 19 біт, може бути лише три-п’ять біт у ширину цього пакета - і ви все це зрозумієте за допомогою побітових операцій.


2

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

Це корисно при програмуванні SIMD- модулів, особливо якщо архітектура процесора навмисно випустила деякі інструкції SIMD, оскільки їх можна було б імітувати кількома іншими.

Наприклад, архітектура може не визначати жодних вказівок щодо прийняття від'ємних значень групи 16 байт, але це може бути імітується побітовим відхиленням, а потім додаванням 1. Аналогічно, віднімання можна також опустити, тому що воно може бути імітується шляхом взяття негатив другого операнда. Наявність "альтернативного маршруту" є причиною пропускання певних інструкцій.

Так само SIMD може підтримувати лише паралельне 8-бітове додавання, не застосовуючи додавання для більш широких елементів, таких як 16-бітний, 32-розрядний або 64-розрядний. Щоб імітувати їх, потрібно витягнути бітовий знак із результату 8-бітового обчислення, а потім виконати операцію перенесення на наступному елементі.


0

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


1
Це досить ортогональна відповідь.
йогобрюс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.