Маніпуляції з байтами і бітами


Даний оператор можете подивитися в практичному застосуванні інверсії малюнка

Функції для зсуву біт в ліву (shl) і праву сторону (shr) сторону. У минулій статті ми з вами бачили з таблиці, що якщо старший біт зрушити вліво і приписати справа 0. то число збільшується вдвічі (тобто ступінь двійки). Якраз для зсуву біт і призначені оператори shl і shr. Оператор SHL працює в сотню разів швидше ніж стандартний оператор піднесення до степеня ^, тому якщо десь потрібна швидкість, правильніше буде пристосувати цей оператор.
При роботі з оператором SHR є деяка хитрість. Цей оператор робить зворотну операцію по відношенню до SHL. проте якщо з правого краю числа був одиничний біт, він при зсуві пропадає назавжди і в розрахунок не йде, в результаті зворотна по відношенню до SHL операція виконується. але залишок пропадає.

Наш процесор складається з 32х бітних регістрів. У кожен з цих регістрів може вміщати тільки 32х бітове число або 4 байта. Якщо число більше, то воно розкидається по регістрах. Звичайно є і великі допоміжні регістри (співпроцесори. В них міститься 80 бітові числа). але швидкість їх значно нижче основних регістрів і працюють вони абсолютно за іншим принципом. Однак при роботі з дробовими числами, обчисленнями коренів і макросами вони дуже зручні і практичні.

Як ви напевно вже зрозуміли 32х бітове число являє собою:

00000000 00000000 00000000 00000000

Як бачите число ділиться на 4 байти або 32 біта. І кожен байт на 8 біт. За допомогою різних макросів ми можемо отримати доступ до кожного біту числа, а так само просто до молодшої та старшої половині (16 бітам) і до молодшої та старшої четвертинці половинки цього числа (8 бітам). Якраз для отримання значення молодшого байта (рожевий колір) і призначений макрос LoByte.


Як ви могли помітити результат 255. Саме цього числа відповідає двійкове подання молодшого байта 11111111

Для отримання старшого байта (синій колір) існує макрос HiByte. Працює він так само, тільки отримує інший байт числа.


Результат 15 і зрозуміло чому, адже правда?

LoWord і Hiword

Для отримання молодшої і старшої половини числа використовуються макроси LoWord і Hiword відповідно. Ці макроси ми вже використовували в статті про консоль.


Результат: 65535 і 65280

Для отримання значення будь-якого біта числа можна застосувати макрос BIT. Його синтаксис:

BIT (число. Номер біта в числі)

Відлік йде з 0 до 31 біта. Якщо біт за даним номером 1. то повертається значення -1. якщо біт за даним номером 0. то повертається значення 0.

Червоним показано, який біт визначається функцією.

Приклад (визначення наявних дисків в системі):


Я звичайно трохи заліз вперед з функцією API (GetLogicalDrives). але мені хотілося показати практичне застосування макросу. По суті функція повертає бітову маску наявних дисків в системі:

0 біт відповідає A
1 біт відповідає B
2 біт відповідає C
3 біт відповідає D
4 біт відповідає E
і так далі.

Макрос BIT визначає заповнення біта. Функцією CHR ми просто виводимо потрібні літери, які відповідають цим дискам.

BitSet і BitReSet

Для установки окремому біту значення 1 або 0. можна використовувати макроси BitSet і BitReSet відповідно. Значення, що повертається - перетворене число з обліків установки біта.

значення = BitSet (число. номер біта в числі)

значення = BitReSet (число. номер біта в числі)


При використанні API функцій Windows ви часто будете стикатися з окремими байтами і бітами числа. Якщо щось незрозуміло в даній статті, пробуємо прочитати і зрозуміти ще раз. Якщо і після цього виникнуть труднощі з розумінням. тоді питаємо на форумі

Схожі статті