bits em linguagem c

Upload: ricardo-sutana

Post on 03-Mar-2016

5 views

Category:

Documents


1 download

DESCRIPTION

Explicação sobre manipulação de bits em linguagem C

TRANSCRIPT

  • Bits em Linguagem C - Conceito e Aplicao Fonte: http://www.embarcados.com.br/bits-em-linguagem-c/

    O domnio de operaes com bits essencial quando se est trabalhando em programao de microcontroladores. Sempre ser necessrio usar bits para a configurao de registradores, configurao de funes especficas e tambm para leitura de status para tomada de deciso. Quando se trabalha com a linguagem Assembly essas operaes so mais naturais, j que existem operaes diretas para isso. Por outro lado a linguagem C tambm trs a facilidade de acesso aos registradores e manipulao de bits atravs dos operadores lgicos bit a bit. Neste artigo iremos abordar o uso de bits em Linguagem C e as principais operaes lgicas em linguagem C.

    Operaes lgicas para usar bits em Linguagem C

    Antes de conhecer os operadores binrios da Linguagem C, vamos relembrar as operaes lgicas em sistemas digitais. Thiago Lima apresentou um excelente resumo sobre portas lgicas e vamos usar o seu artigo como referncia.

    Lgica No (NOT)

    Inverte o estado do bit.

    Tabela verdade:

    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:

    Lgica Ou-Exclusivo (XOR)

    A sada ser igual a 0 se as entradas forem iguais. Caso as entradas forem diferentes a sada assumir o valor 1.

    Tabela verdade:

  • Operadores binrios em linguagem C

    A linguagem C apresenta uma grande variedade de operadores. A seguir so apresentados os operadores para operaes binarias, bit a bit:

    Operador Funo

    & E (AND)

    | OU (OR)

    ^ OU-EXCLUSIVO (XOR)

    ~ NOT ou Complemento de 1

    > Deslocamento direita

    Os operadores &, |, ^ e ~ funcionam como apresentado anteriormente e tm as saidas conforme exibidos em suas tabelas verdades. Os operadores de deslocamento fazem o shift de bits para esquerda ou direita.

    Exemplo:

    Vamos assumir que x incialmente tenha o valor 0b00000001, valor 1 em decimal.

    x = (x1);

    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.

  • Usando mscara de bits

    Para manipulao dos bits utilizam-se mscaras de bits que possibilitam a alterao ou leitura de bits especficos sem a alterao de outros. A seguir so exibidas algumas operaes.

    Ativando um bit

    Para ativar um bit especifico de uma varivel ou registrador, ou seja, colocar nvel lgico 1, utiliza-se o operador |(OU). Por exemplo, desejamos colocar em nivel 1 o bit 5 do PORTB, no ATmega328. Para isso fazemos a seguinte operao:

    PORTB = PORTB|0b00100000;

    X X X X X X X X -> valor presente no registrador PORTB

    | 0 0 1 0 0 0 0 0 -> mscara para alterao do bit 5

    X X 1 X X X X X -> resultado, apenas o bit 5 alterado

    Para facilidade na criao da mscara, utiliza-se o operador de deslocamento esquerda, ficando da seguinte forma:

    PORTB = PORTB | (1

  • X X X X X X X X -> valor presente no registrador PORTB

    & 1 1 0 1 1 1 1 1 -> mscara para alterao do bit 5

    X X 0 X X X X X -> resultado, apenas o bit 5 alterado

    Usando o operador de deslocamento ficar da seguinte forma:

    PORTB = PORTB & (~(1

  • 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

  • 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 setBit(valor,bit) (valor |= (1

  • Podemos tambm usar a compilao condicional, conforme apresentada no artigo Pr-processador C: Compilao condicional, escrito por Fernando Deluno Garcia, e testar o tamanho de cdigo gerado, usando macros e as funes do Arduino:

    //#define ARDUINO_FUNC 1 //comente para uso de macros

    #define setBit(valor,bit) (valor |= (1

  • 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.