Página 1 de 1
MACRO PARA SETAR E ZERAR BIT EM C (DÚVIDA)

Enviado:
19 Set 2007 17:15
por Jagger
Mestres, tenho uma dúvida. As seguintes macros podem ser usadas para setar e limpar bits de uma variável em C no compilador PICC da HI-TECH:
#define bitset(var,bitno) (var|=1UL<<(bitno))
#define bitclr(var,bitno) (var&=~(1UL<<(bitno)))
Funcionam, mas gosto de entender e não apenas copiar. O que significa 1UL nesse comando? Como essas macros agem? Obrigado, prezados amigos.

Enviado:
19 Set 2007 17:30
por ze
para facilitar a vida dos mestres segue a macro que uso:
#define setbit(var,bitno) ((var) |= 1 << (bitno))
#define clrbit(var,bitno) ((var) &= ~(1 << (bitno)))
de quebra, inverter bit
#define xorbit(var,bitno) ((var) ^= 1 << (bitno))
troque 1Ul por 1 e tente entender. dá no mesmo (acho que não ajudei nada! mas aguarde...)

Enviado:
19 Set 2007 17:45
por Jagger
Muito obrigado lellis, show!!!

Enviado:
19 Set 2007 17:51
por Maurício
Olá, Jagger.
Não conheço o PICC, mas, acredito que o UL seja referente à UNSIGNED LONG, ou seja, a macro faz um "casting" no numeral 1 pra unsigned long, antes de fazer a operação, o que permite fazer operações com qualquer número inteiro até o limite do unsigned long ( 32 bits no seu caso? ).
Quando vc cria uma macro o compilador substitui o nome da macro pelo texto que está a direita da macro.
No caso dessas macros que vc citou, a macro substitui os valores que foram digitados pelos equivalentes na fórmula que está à direita da macro.
#define bitset(var,bitno) (var|=1UL<<(bitno))
No programa, a variavel var tem o valor de 0xA2, e queremos setar o bit 3 dessa variável (D2), então usamos a macro:
bitset (var, 2 );
Na compilação, quando o pré-processador encontrar essa macro, ele irá fazer as seguintes modificações:
bitset (var, 2 ); // local da chamada no programa
0xA2 |= 1UL << 2 // operação do pré-processador, sem esquecer que ANTES de fazer a operação de deslocamento no numeral 1, o número 1 é convertido para LONGO.
Espero que ajude.
[]'s

Enviado:
20 Set 2007 08:08
por andre_luis
Só pra constar :
O PIC, assim como diversos outros cores, possui instruções de manipulação de bits, e por isso pode-se usar comandos set e clear de bit's diretamente. Na verdade, se o compilador tiver alguma otimização, saberá que pode trocar cada uma dessas macros acima por uma única instrução ( bitset ou bitclear ).
+++

Enviado:
21 Set 2007 10:51
por Jagger
Muito obrigado, Maurício e André. Abraço.