Página 1 de 1

MACRO PARA SETAR E ZERAR BIT EM C (DÚVIDA)

MensagemEnviado: 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.

MensagemEnviado: 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...)

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

MensagemEnviado: 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

MensagemEnviado: 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 ).


+++

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