Битовые операции

Библиотека битовых операций – это набор общепринятых макрофункций для совершения типичных битовых действий. Эти функции могут быть использованы в любых регистрах и типах данных, так как у макрофункций нет конкретного типа данных. Функции подходят 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 <homelab/bit.h>
 
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))
ru/software/homelab/library/bit.txt · Last modified: 2020/07/20 09:00 by 127.0.0.1
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0