Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Peixoto

Operações com campo de bit

Recommended Posts

http://forum.imasters.com.br/public/style_emoticons/default/natal_sad.gif Obtive a seguinte informação

| - ou inclusivo bit a bit - 001 | 011 = 011 - se qualquer um dos dois bits for 1 o resultado é 1, se os dois forem 0 o resultado é 0;& - e lógico bit a bit - 001 | 011 = 001 - se os dois bits forem 1 o resultado é 1, se qualquer um dos bits for 0 o resultado é 1;^ - ou exclusivo bit a bit - 001 | 011 = 010 - se um e apenas um dos dois bits for 1 o resultado é 1, se os dois forem 0 ou se os dois forem 1 o resultado é 0.

Mas mão estou entendendo. Fiz o seguinte teste, com o operador | "ou" de capo de bit, com base na explicação, mas não está dando muito certo :
...................int valor1 = 4;int valor2 = 5;char binario4[20];printf ("\nComparando os numeros 4 e 5\n");	if (itoa(valor1 | valor2, binario4, 2))	   {		printf ("\nResultado:Um dos bits e 1 (um)\n\n");	   }   else 		{		 printf ("\nResultado:Os dois bits são 0 (zero)\n\n");		}		 	system ("pause");...................................

Resultado: Comparando os numeros 4 e 5Resultado:Um dos bits e 1 (um)

O fato é que não estou sabendo ativar o “else”, já mudei os valores 4 e 5 por outros, e o resultado é sempre o mesmo. Definitivamente, não estou sabendo interpretar o “ou” (|) e o “e” (&) de campo de bit Não estou ver o funcionameno da escolha de uma coisa ou outra. Poderia ajudar ?Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

O fato é que não estou sabendo ativar o “else”, já mudei os valores 4 e 5 por outros, e o resultado é sempre o mesmo. Definitivamente, não estou sabendo interpretar o “ou” (|) e o “e” (&) de campo de bit Não estou ver o funcionameno da escolha de uma coisa ou outra. Poderia ajudar ?

o else só executa quando o "if" for falsoe quando o "if" será falso?creio que nunca.a função itoa não tem tratativa de erro e retorna uma string.voce pode me perguntar, mas se eu comparar bit a bit "0 ou 0", não me retorna 0, ou seja, falso?a resposta é não, já que a função itoa retorna a string resultante, onde o caracter 0 é bem diferente do inteiro 0.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Kandrade e colegas,Como posso então, exemplificar ou mostras em vídeo o uso dos operadores | (ou) e & (e) ? estou batendo cabeça nisso a um tempao ? a visão de "ou" e"E"que tenho é o do do llógigo não o de "ou" e "e" de bit. O que faço ?Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

:mellow: Kandrade,Não é tão simples, veja sua explicação:

o else só executa quando o "if" for falsoe quando o "if" será falso?creio que nunca.a função itoa não tem tratativa de erro e retorna uma string.voce pode me perguntar, mas se eu comparar bit a bit "0 ou 0", não me retorna 0, ou seja, falso?a resposta é não, já que a função itoa retorna a string resultante, onde o caracter 0 é bem diferente do inteiro 0

O que quero é usar (|) para comparar bit a bit como se fossem numeros, e mostrar o resultado, por isso a idéia do else, que você já disse que não funciona. a ideia é: se o "ou" de bit for 0 mostre um resultado se o "ou" de bit der 0, mostre outra coisa. Entendeu a idéia?ObrigadoObrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

 

Vou tentar explicar melhor: transforme os números sobre os quais você quer fazer a operação em binário.

 

Vamos tomar seu exemplo: 4 e 5. Teremos respectivamente "100" e "101".

 

Operação '|':

Tabela:

0 | 0 = 0

0 | 1 = 1

1 | 0 = 1

1 | 1 = 1

 

Começando pelo bit menos significativo de cada número, ou seja pela direita:

100

101

0 | 1 = 1 (pela linha 2 da tabela)

Logo o resultado será xx1

 

Próximo:

100

101

0 | 0 = 0 (pela linha 1 da tabela)

Logo o resultado será x01

 

Próximo:

100

101

1 | 1 = 1 (pela linha 3 da tabela)

Logo o resultado será 101

 

Ou seja o número final em binário é 101 = 5

=====================================

Operação '&':

Tabela:

0 & 0 = 0

0 & 1 = 0

1 & 0 = 0

1 & 1 = 1

 

Começando pelo bit menos significativo de cada número, ou seja pela direita:

100

101

0 | 1 = 0 (pela linha 2 da tabela)

Logo o resultado será xx0

 

Próximo:

100

101

0 | 0 = 0 (pela linha 1 da tabela)

Logo o resultado será x01

 

Próximo:

100

101

1 | 1 = 1 (pela linha 3 da tabela)

Logo o resultado será 101

 

Ou seja o número final em binário é 100 = 4

=====================================

Operação '^':

Tabela:

0 ^ 0 = 0

0 ^ 1 = 1

1 ^ 0 = 1

1 ^ 1 = 0

 

Começando pelo bit menos significativo de cada número, ou seja pela direita:

100

101

0 | 1 = 1 (pela linha 2 da tabela)

Logo o resultado será xx1

 

Próximo:

100

101

0 | 0 = 0 (pela linha 1 da tabela)

Logo o resultado será x01

 

Próximo:

100

101

1 | 1 = 0 (pela linha 3 da tabela)

Logo o resultado será 001

 

Ou seja o número final em binário é 001= 1

=====================================

PS: Se um dos números tiver mais digitos que o outro, complete o que tiver menos digitos com zeros à esquerda.

Exemplo: 1 & 7 = 001 & 111 = 001.

 

Se você ainda está em dúvida ou quer testar alguns valores, eis aqui o código fonte em C que dados 2 números realiza essas 3 operações:

 

# include <stdio.h># include <string.h># define T 100int itob (int n, char *bin){  int i, j;  char bin_inv[T];  i = 0;  while (n){	bin_inv[i++]='0'+n%2;	n/=2;  }  for (i--,j=0;i>=0;i--,j++)	bin[i]=bin_inv[j];  bin[j]='\';  return j;}void addZeroes(int n){  int i;  for (i=0; i<n; i++)	printf("0");}int maxlist (int a, int b, int c){  int max = a;  if (b > max) max = b;  if (c > max) max = c;   return max;}void opBin (int n, int m, int op){  char bin1[T], bin2[T], bin3[T];  char Opt[]={"|&^"};  int n_len, m_len, k_len;  int k;  int maxlen;  n_len = itob(n,bin1);  m_len = itob(m,bin2);  if (op == 0)	k = n | m;  else if (op == 1)	k = n & m;  else	k = n ^ m;    k_len = itob(k,bin3);    maxlen = maxlist (n_len,m_len,k_len);    printf("%d(",n);  addZeroes(maxlen-n_len);  printf("%s) %c %d(",bin1,Opt[op],m);  addZeroes(maxlen-m_len);  printf("%s) = %d(",bin2,k);  addZeroes(maxlen-k_len);  printf("%s)\n",bin3);}int main (){  int n, m, i;  while (scanf("%d %d",&n,&m)!=EOF){	for (i=0; i<3; i++)	  opBin (n,m,i);  }  return 0;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

:unsure: matt.cavotta e colegas,Achei essa explicação ótima, entretanto, senti dificuldade, de entender o código fonte que você forneceu.Copie e colei o exemplo, que você forneceu em meu compilador, e ao rodar, apareceu as seguintes mensagens de erro:

C:\Meus documentos\bin.c In function `itob': 16 C:\Meus documentos\bin.c missing terminating ' character 17 C:\Meus documentos\bin.c syntax error before "return"

O que está errado ? pensei, que fosse a falta de protótipo, mas experimentei, e vi que não era isso.Você teria um exemplo mais simples ? teria como fazer o mesmo que se está fazendo com complemento

x = (~y);

ou seja

x = (y|y)

e mostrar num “for” ?Seria mais simples, mesmo que se usasse string. Tem como fazer ? Poderia dar novo exemplo baseado nessa idéia ?Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.Provavelmente você está utilizando um compilador no windows. Aqui no Ubuntu 6.10 funciona.Sendo assim, não posso fornecer um código fonte, pois mesmo que mais simples, continuará apresentando os mesmos erros.Mas, se você quiser, eu posso dar uma explicação teórica sobre a complementação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

:(

 

matt.cavotta e colegas,

 

Sim estou usando Dev-C++, que é uma ide para windows (Mingw).

 

O código abaixo, tem um exemplo de “ou”(|) e “e” (&) binário, que roda em meu compilador. Entretanto não atende as expectativas do que estamos conversando ou que eu esteja querendo. Não está mostrando a comparação entre 4 e 5 de forma clara.Você poderia altera-lo ou analisalo para confirmar minha afirmação ?

 

Sim gostaria que você completasse a explicação teórica, falando de complemento a um e a dois.

 

#include <stdlib.h>#include <stdio.h>int main(){int valor1 = 4;int valor2 = 5;char binario[8];printf("%i\n", valor1);itoa(valor1, binario, 2);printf("%s\n", binario);printf("%i\n", valor2);itoa(valor2, binario, 2);printf("%s\n", binario);itoa(valor1 & valor2, binario, 2);printf("AND = %s\n", binario);itoa(valor1 | valor2, binario, 2);printf("OR = %s\n", binario);system("pause");return (0);}

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

:( Pessoal, fiz mais alguns experimentos, para poder dar mais informações para vocês poderem me ajudar.

int main(){	int valor1 = 4;	int valor2 = 5;	int x,y,i;	char binario[8];	char binario2[20];	char binario3[8];	char binario4[20];	printf ("\nComparando os numeros 4 e 5\n");	itoa(valor1 | valor2, binario4, 2);	for (i=0;i<20;i++)	 {	 printf("\n\"Ou\" de campo de bit:   %s\n", binario4[i]);	 }system ("pause");return (0); }
Gostaria de saber, se este programa mostra melhor a comparação de números binários, usando o operador de bit “ou” (|), equivalentes ao número 4 e 5 ?=================================================Depois fiz novos testes, e descobri, que o “for não faz falta, pois repete verticalmente o resultado por printf. Desta forma o código teve a seguinte alteração.
itoa(valor1 | valor2, binario4, 2);printf("\n\"Ou\" de campo de bit:   %s\n",binario4);
O printf, mostrou o seguinte resultado:

Comparando os numeros 4 e 5"Ou" de campo de bit: 10100

Gostaria de saber como interpretar esse valor. O numero binário 10100 é a representação composta pela comparação (|) dos números 4 e 5 ? pergunto isso. Porque o 101 corresponde ao 5 e 0 00 é o final da representação de 4. Pergunto isso, porque acho que não consegui visualizar nesse código, a expicação de operação de campo de bit dada acima. Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, tá muito estranho isso. Vendo o código por cima, era para estar ok! Entretanto, eu desconheço o funcionamento exato desta função 'itoa'. Na verdade eu nunca a tinha visto (sempre que preciso eu implemento).Mas se sua dúvida é conceitual, acho que não precisamos perder tempo com depuração =/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gostaria de saber como interpretar esse valor. O numero binário 10100 é a representação composta pela comparação (|) dos números 4 e 5 ? pergunto isso. Porque o 101 corresponde ao 5 e 0 00 é o final da representação de 4.

não é nãoa representação do "ou" bit a bit de 5 e 4 é: 101 como explicado acima.se o resultado obtido é: 10100 está errado pode ser sujeira na variável.

Compartilhar este post


Link para o post
Compartilhar em outros sites

matt.cavotta Você poderia continuar com a explicação conceitual falando de complemento a um e a dois ?Kandrade,Como posso fazer para resolver esse possível problema de sujeira ? seria inicializando ? Ex:

char binario4[20]={'\o'};

tentei essa alternativa, mas o "lixo" continuou.. :( Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

matt.cavotta Você poderia continuar com a explicação conceitual falando de complemento a um e a dois ?

Olá. Não entendi direito o que você quer dizer com isso. Seria complemento de 1 e complemento de 2? Ou complemento bit a bit?

Compartilhar este post


Link para o post
Compartilhar em outros sites

:rolleyes: matt.cavotta Simplesmente me referi a sua oferta de continuar a explicação teórica. Embora já tenha visto exemplos de complemento a um e a dois, não entendi direito os conceitos.Desculpe a ignorância, mas o conceito de complemento bit a bit, não está dentrotro de complemento 1 e a 2 ?Agradeço muito se tirar essa dúvida.Obigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

:rolleyes:

 

pessoal,

 

Descobri, que complemento a um é a aplicação de sinal no numero binário. e complemento a dois, seria o sinal contrário. Ou seja:

 

-3 1101

+ 4 0100

----------

10001

O qual é posto mais a esquerda. Gostaria de saber, se essa definição está certa, e qual seia a aplicação de complemento a um e a dois.

 

Outra dúvida que tenho, é o uso de deslocamento de bit a esquerda e a direita (>>, <<) como funciona e para que serve ?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue um código simples, acho que tava tendo problemas por causa dessa função itoa.

 

#include <stdio.h>

int main()
{
	int x,y;
	x = 4;
	y = 5;
	printf("Resultado: %d",x | y);
	printf("\nResultado: %d",x & y);
	printf("\nResultado: %d",x ^ y);
	printf("\nResultado: %d",~x); //Complemento de um, inverte os bits(onde eh 0 fica 1 e vice versa)
	printf("\nResultado: %d",x<<1); //Multiplica por dois a cada deslocamento feito para ESQUERDA
	printf("\nResultado: %d",x>>1); //Divide por dois a cada deslocamento feito para DIREITA
	return(0);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.