====== 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))