Operações com Bits - Programação 1 - Engenharia

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar

Objetivos

  • operações com bits

Operações bit a bit disponíveis

Symbol Operator
& bitwise AND
l bitwise inclusive OR
^ bitwise exclusive OR
<< left shift
>> right shift
~ one's complement (unary)

Rotacionando a direita

#include <stdio.h>

main()
{
  unsigned char i;

  i=0x80;
  printf("i=%d ou em hex i=0x%x\n", i, i);
  i=i>>2; /* rotaciona dois bits a direita */
  printf("i=%d ou em hex i=0x%x\n", i, i);
}

Note que na memória o valor 0x80 aparece como:

 10000000

Rotacionando dois bits a esquerda este valor fica:

 00100000

Que corresponde ao valor 0x40


Rotacionando a esquerda

#include <stdio.h>

main()
{
  unsigned char i;

  i=0x14;
  printf("i=%d ou em hex i=0x%x\n", i, i);
  i=i<<3; /* rotaciona três bits a esquerda */
  printf("i=%d ou em hex i=0x%x\n", i, i);
}

Note que na memória o valor 0x80 aparece como:

 00010100

Rotacionando três bits a esquerda este valor fica:

 10100000

Que corresponde ao valor 0xA0

NOTE que uma rotação a direita corresponde em dividir o número por 2 enquanto uma rotação a esquerda corresponde a multiplicar o número por 2.

Operações lógicas bit a bit

Lembrar que :

bit a bit b a & b (a AND b)
0 0 0
0 1 0
1 0 0
1 1 1


bit a bit b a | b (a OR b)
0 0 0
0 1 1
1 0 1
1 1 1



#include <stdio.h>

main()
{
  unsigned char i;

  i=0xF2;
  printf("Operação E com a máscará 0x03 -> %x\n", i&0x03);
  printf("Operação OR com a máscará 0x03 -> %x\n", i|0x03);
  printf("Operação OR EXCLUSIVO com a máscará 0x03 -> %x\n", i^0x03);
  printf("Complementando i -> %x\n", (char)~i);
}

Note que as operações acima são realizadas em nível de bit e não conforme as operações lógicas realizadas sobre expressões.

Exercício:

Implementar uma função que retorna o valor da operação lógica bita a bit sobre os valores de um vetor de bytes como parâmetro. Veja esqueleto abaixo.

unsigned char oplog (unsigned char pVetor[], int tam, char operador)
{
}

main()
{
  unsigned char alfa[3] = { 0xFF,0xAA,0x00};
  unsigned char valor;

  valor = oplog(alfa, 3, '|'); /* calcula o OU bit a bit sobre o vetor */
  valor = oplog(alfa, 3, '&'); /* calcula o E bit a bit sobre o vetor */
  valor = oplog(alfa, 3, '^'); /* calcula o OU EXCLUSIVO bit a bit sobre o vetor */ 
}