This is an old revision of the document!
Библиотека битовых операций – это набор общепринятых макрофункций для совершения
типичных битовых действий. Эти функции могут быть использованы в любых регистрах и
типах данных, так как у макрофункций нет конкретного типа данных. Функции подходят
8-, 16- и 32-битным переменным и регистрам. Эти битовые операции используются всеми
другими частями библиотеки, поэтому функции выписаны в главе исходного кода.
Битовым индексом считается порядковый номер бита, начиная с наименее важного (англ.
least significant bit, сокращённо LSB). Подсчёт начинается с нуля. Значение битового индекса
у 8-битного числа 0-7, у 16-бинтого - 0-15 и 32-битного 0-31.
Bitiindeksi teisendamine bitimaskiks. Parameetrid:
Muutujas kindla biti kõrgeks seadmine. Parameetrid:
Muutujas kindla biti madalaks seadmine. Parameetrid:
Muutujas kindla biti soovitud olekusse seadmine. Parameetrid:
Muutujas kindla biti oleku ümberpööramine (madal kõrgeks ja vastupidi). Parameetrid:
Väärtuse kindla biti kõrgeloleku kontroll. Parameetrid:
Väärtuse kindla biti madaloleku kontroll. Parameetrid:
Muutujas b kolmanda biti kõrgeks seadmine ja viimase ümberpööramine.
#include <homelab/bit.h> int main(void) { unsigned char b = 0x00; bit_set(b, 2); bit_invert(b, 7); }
Järgnevalt on lühendatud kujul toodud teegi lähtekood, kust on näha, mis iga makrofunktsiooni taga peitub:
// // Funktsioonid bittidega tegelemiseks // #define bit_mask(bit) (1 << (bit)) #define bit_set(value, bit) value |= bit_mask(bit) #define bit_clear(value, bit) value &= ~bit_mask(bit) #define bit_invert(value, bit) value ^= bit_mask(bit) #define bit_is_set(value, bit) ((value) & (bit_mask(bit))) #define bit_is_clear(value, bit) (!((value) & (bit_mask(bit)))) #define bit_set_to(v, b, x) v = ((x) ? (v | bit_mask(b)) : (v & ~bit_mask(b))) // // Funktsioonid bitimaskidega tegelemiseks // #define bitmask_set(value, bitMask) value |= (bitMask) #define bitmask_clear(value, bitMask) value &= ~(bitMask) #define bitmask_invert(value, bitMask) value ^= (bitMask) #define bitmask_set_to(v, m, x) v = ((x) ? (v | (m)) : (v & ~(m))) #define bitmask_is_set(value, bitMask) ((value) & (bitMask))