Peixoto 0 Denunciar post Postado Dezembro 23, 2006 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
Kandrade 7 Denunciar post Postado Dezembro 27, 2006 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
Peixoto 0 Denunciar post Postado Dezembro 30, 2006 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
Kandrade 7 Denunciar post Postado Janeiro 3, 2007 como voce queria que exemplificar? mostrar o resultado ajuda? acrescente: printf("Resultado: %s", teste); Compartilhar este post Link para o post Compartilhar em outros sites
Peixoto 0 Denunciar post Postado Janeiro 6, 2007 :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 0O 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
matt.cavotta 0 Denunciar post Postado Janeiro 7, 2007 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
Peixoto 0 Denunciar post Postado Janeiro 7, 2007 :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
matt.cavotta 0 Denunciar post Postado Janeiro 7, 2007 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
Peixoto 0 Denunciar post Postado Janeiro 7, 2007 :( 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
Peixoto 0 Denunciar post Postado Janeiro 13, 2007 :( 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: 10100Gostaria 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
matt.cavotta 0 Denunciar post Postado Janeiro 17, 2007 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
Kandrade 7 Denunciar post Postado Janeiro 18, 2007 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
Peixoto 0 Denunciar post Postado Janeiro 21, 2007 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 0 Denunciar post Postado Janeiro 21, 2007 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
Peixoto 0 Denunciar post Postado Janeiro 22, 2007 :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
Peixoto 0 Denunciar post Postado Fevereiro 4, 2007 :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
gRoOvE 0 Denunciar post Postado Agosto 30, 2008 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