====== Operações bit a bit ======
A biblioteca de operações bit a bit contém um conjunto de funções macro para realizar manipulações de bits típicas. Estas são usadas pelo resto da biblioteca e podem ser usadas em qualquer lado. Como as funções macro não têm tipo podem ser usadas com qualquer tipo.
O indíce do bit é usado para especificar o bit no número binário. Os indíces contam-se a partir de zero, em que este representa o bit menos significativo (LSB). Por exemplo, um número de 8 bits tem 8 bits com indíces de 0 até 7 e um número de 16 bits tem indíces de 0 até 15.
===== Funções=====
* **//bit_mask(bit)//** \\
Conversão de indíce de bit para uma máscara. Parâmetros:
* //bit// - Indíce do bit.
* Devolve a máscara do bit.
* **//bit_set(value, bit)//** \\
Define um bit específico numa variável. Parâmetros:
* //value// - Variável.
* //bit// - Indíce do bit.
* **//bit_clear(value, bit)//** \\
Limpa um bit específico numa variável. Parâmetros:
* //value// - Variável.
* //bit// - Indíce do bit.
* **//bit_set_to(value, bit, state)//** \\
Define um bit específico numa variável para um estado desejado. Parâmetros:
* //value// - Variável.
* //bit// - Indíce do bit.
* //state// - Estado (//true// ou //false//).
* **//bit_invert(value, bit)//** \\
Inverte um bit específico numa variável. Parâmetros:
* //value// - Variável.
* //bit// - Indíce do bit.
* **//bit_is_set(value, bit)//** \\
Verifica se um bit específico numa variável está ou não definido. Parâmetros:
* //value// - Variável.
* //bit// - Indíce do bit.
* Devolve valor booleano //true// quando o bit está definido e //false// quando o mesmo está limpo.
* **//bit_is_clear(value, bit)//** \\
Verifica se um bit específico numa variável está ou não limpo. Parâmetros:
* //value// - Variável.
* //bit// - Indíce do bit.
* Devolve valor booleano //true// quando o bit está limpo e //false// quando o mesmo está definido.
===== Exemplo =====
Definir o terceiro bit na variável de 8 bits //b// e inverter o último bit.
#include
int main(void)
{
unsigned char b = 0x00;
bit_set(b, 2);
bit_invert(b, 7);
}
===== Source =====
Mostra-se de seguida uma versão curta do código fonte da biblioteca de operações bit a bit.
//
// Functions for handling bits.
//
#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)))
//
// Functions for handling bit masks.
//
#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))