Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Fonte: http://www.embarcados.com.br/bits-em-linguagem-c/
Lgica E (AND)
A sada ser igual a 1 somente se todos os bits de entrada forem iguais a 1. Se pelo menos um dos
bits for 0, a sada ser 0.
Tabela verdade:
Lgica OU (OR)
A sada assumir nvel lgico 1 se pelo menos 1 bit de entrada for igual a 1. Somente assumir nvel
lgico 0 se todas as entradas apresentarem nvel lgico 0.
Tabela verdade:
Funo
&
E (AND)
OU (OR)
OU-EXCLUSIVO (XOR)
NOT ou Complemento de 1
<<
Deslocamento esquerda
>>
Deslocamento direita
Aps essa operao ser atribudo varivel x o valor 0b00000010, valor 2 em decimal.
Note que a operao de deslocamento esquerda multiplica por dois a cada shift. J o deslocamento
direita, divide por dois a cada shift. Dessa forma pode-se tambm utilizar esses operadores para
multiplicao ou diviso por 2, sendo mais eficiente que utilizando o operador de multiplicao.
XXXXXXXX
|00100000
XX1XXXXX
Ser feita a lgica OU com o byte criado na operao (1<<5), que deslocou o valor '1' 5 vezes para a
esquerda.
A operao pode ser simplificada, ficando da seguinte forma:
PORTB |= (1<<5);
Limpando um bit
Para limpar um bit especfico de uma varivel ou registrador, ou seja, colocar nvel lgico 0, utiliza-se
o operador & (AND). Vamos utilizar o mesmo registrador e bit utilizado no exemplo anterior como
exemplo:
PORTB = PORTB & 0b11011111;
XXXXXXXX
&11011111
XX0XXXXX
Note que necessrio inverter os valores para a mscara ficar da forma desejada.
A operao pode ser simplificada, ficando da seguinte forma:
PORTB &= ~(1<<5);
XX1XXXXX
^00100000
XX0XXXXX
XXXXXTXX
&00000100
00000T00
Caso o bit de teste tenha o valor 1, o resultado conter o valor 1 somente na posio do bit, caso
contrrio o resultado ser 0.
Esta operao pode ser usada em uma estrutura de descio if, por exemplo:
if (PIND & (1 << 4)) {
//executa comandos dentro do if se o pino testado estiver com o valor lgico 1
}
Criando Macros
Fernando Deluno Garcia apresentou uma excelente srie sobre o Pr-Processador C. Utilizando seus
atigos como referncia, vamos criar algumas macros para manipulao de bits utilizando as
operaes apresentadas.
set bit
clear bit
toogle bit
teste bit
#define testBit(valor,bit)
Exemplo de aplicao
O exemplo a seguir exibe o uso das macros apresentadas para manipulao de bits no Atmega328P.
Foi utilizada a IDE Arduino, para que voc possa facilmente testar, utilizando a placa Arduino UNO.
#define
#define
#define
#define
setBit(valor,bit)
(valor |= (1<<bit))
clearBit(valor,bit)
(valor &= ~(1<<bit))
testBit(valor,bit)
(valor & (1<<bit))
toggleBit(valor, bit) (valor ^= (1<<bit))
#define LED 5
#define BT 2
void setup() {
setBit(DDRB,LED);
clearBit(DDRD,BT);
}
void loop() {
if(!testBit(PIND,BT)){
setBit(PORTB,LED);
}
else{
clearBit(PORTB,LED);
}
}
#else
#define LED 5
#define BT
#endif
void setup() {
#ifndef ARDUINO_FUNC
setBit(DDRB,LED);
clearBit(DDRD,BT);
#else
pinMode(LED, OUTPUT);
pinMode(BT, INPUT);
#endif }
void loop() {
while(1){
toggleBit(PORTB,LED);
delay(1000);
}
#ifndef ARDUINO_FUNC
if(!testBit(PIND,BT)){
setBit(PORTB,LED);
}
else{
clearBit(PORTB,LED);
}
#else
if(digitalRead(BT) == LOW){
digitalWrite(LED,HIGH);
}
else{
digitalWrite(LED,LOW);
}
#endif
}
Compile nas duas condies e verifique o tamanho do cdigo gerado em cada uma delas. Note que o
cdigo gerado utilizando macros bem menor do que quando utilizando as funes Arduino.
As macros utilizadas acimas podem ser aplicadas em diversas plataformas e facilitam em operaes
com bits.