====== Битовые операции ======
Библиотека битовых операций – это набор общепринятых макрофункций для совершения типичных битовых действий. Эти функции могут быть использованы в любых регистрах и типах данных, так как у макрофункций нет конкретного типа данных. Функции подходят 8-, 16- и 32-битным переменным и регистрам. Эти битовые операции используются всеми другими частями библиотеки, поэтому функции выписаны в главе исходного кода.
Битовым индексом считается порядковый номер бита, начиная с наименее важного (англ. //least significant bit//, сокращённо LSB). Подсчёт начинается с нуля. Значение битового индекса у 8-битного числа 0-7, у 16-бинтого - 0-15 и 32-битного 0-31.
===== Функции =====
* **//bit_mask(bit)//** \\
Перевод битового индекса в битовую маску. Параметры:
* //bit// - Битовый индекс.
* Возвращает битовую маску.
* **//bit_set(value, bit)//** \\
Настойка конкретного бита в высокое положение в переменной. Параметры:
* //value// - Переменная.
* //bit// - Битовый индекс.
* **//bit_clear(value, bit)//** \\
Настойка конкретного бита в низкое положение в переменной. Параметры:
* //value// - Переменная.
* //bit// - Битовый индекс.
* **//bit_set_to(value, bit, state)//** \\
Настойка конкретного бита в желаемое положение в переменной. Параметры:
* //value// - Переменная.
* //bit// - Битовый индекс.
* //state// - Значение (//true// или //false//).
* **//bit_invert(value, bit)//** \\
Инвертирование (низкий высоким и наоборот) состояния конкретного бита в переменной. Параметры:
* //value// - Переменная.
* //bit// - Битовый индекс.
* **//bit_is_set(value, bit)//** \\
Контроль высокого положения значения конкретного бита. Параметры:
* //value// - Переменная.
* //bit// - Битовый индекс.
* Возвращает значение //true//, если бит высокий и //false//, если низкий.
* **//bit_is_clear(value, bit)//** \\
Контроль низкого положения значения конкретного бита. Параметры:
* //value// - Переменная.
* //bit// - Битовый индекс.
* Возвращает значение //true//, если бит низкий и //false//, если высокий.
===== Пример =====
Установка третьего бита высоким и инвертирование последнего в переменной //b//.
#include
int main(void)
{
unsigned char b = 0x00;
bit_set(b, 2);
bit_invert(b, 7);
}
===== Исходный код =====
Далее приведён сокращённый исходный код библиотеки, где видно, что скрывается за каждой макрофункцией:
//
// Функции для работы с битами
//
#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)))
//
// Функции для работы с битовыми масками
//
#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))