Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #58 da revista programar. Faz já o download aqui!

einstein

Conversao de dois numeros para binario

Mensagens Recomendadas

einstein    0
einstein

Como posso criar um procedimento que receba como argumentos um numero e o numero máximo de caracteres para apresentar no ecra. E converta este numeor em binario apresentado-o com aquele numero de caracteres?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

Coisas a ter em conta:

1) se o número não couber nos caracteres especificados

2) numero negativo?

3) numero com virgula, por exemplo PI

4) o procedimento devolve alguma coisa?

5) a apresentacao é alinhada à esquerda, à direita ... com espaços, com zeros?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
einstein    0
einstein

Coisas a ter em conta:

1) se o número não couber nos caracteres especificados

2) numero negativo?

3) numero com virgula, por exemplo PI

4) o procedimento devolve alguma coisa?

5) a apresentacao é alinhada à esquerda, à direita ... com espaços, com zeros?

Para simplificar o numero é inteiro,em relação ao numero caber ou nao isso tem de depender de o valor de digitos maximo introduzido pelo utilizador. O procedimento nao devolve nada apenas escreve no ecra o numero em binario com o numero de bits definido pelo utilizador. A apresentação pode ser alinha a esquerda.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

Imagina que já tens o procedimento feito e eu o chamava assim:

imprimirbinarionoecra(-42, 5); // apresenta 42 negativo em 5 bits

O que é que querias que aparecesse no ecra?

Se afinal não pode ser negativo ... imagina isto

imprimirbinarionoecra(42, 5); // apresenta 42 em 5 bits

Podes aproveitar a minha sugestão acima e chamar ao teu procedimento o mesmo que eu chamei ao meu.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
einstein    0
einstein

Imagina que já tens o procedimento feito e eu o chamava assim:

imprimirbinarionoecra(-42, 5); // apresenta 42 negativo em 5 bits

O que é que querias que aparecesse no ecra?

Se afinal não pode ser negativo ... imagina isto

imprimirbinarionoecra(42, 5); // apresenta 42 em 5 bits

Podes aproveitar a minha sugestão acima e chamar ao teu procedimento o mesmo que eu chamei ao meu.

tem que aparecer no ecra os ultimos 5 bits menos significativos.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1134
HappyHippyHippo

algo deste género ??

void present_bits(int value, int n_bits) {
  int mask, iter;

  for(iter = 0, mask = 1; iter < sizeof(int) && iter < n_bits; iter++, mask << 1)
    printf("%d", (value & mask) != 0);
  printf("\n");
}

PS : agora vi que estou a apresentar do menos significativo para o mais significativo .... deverás alterar a ordem de apresentação

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
einstein    0
einstein

Ainda nao consegui perceber como se faz este programa o código que fiz foi o seguinte

#include<stdio.h>
#include<stdlib.h>

void converte(unsigned int num, int n_bits) {
int mascara=0;
int and=0;	
int aux=0;
mascara= 1 << (n_bits-1);
while(n_bits>0){
	and= num & mascara;
	if (and==0){
		printf("0");
	}else{
		printf("1");
	}
	aux=num<<1;
	n_bits--;
}	
}
int main() {
int numero=0;
int n_bits=0;

printf("Introduza o numero a converter e o numero de bits que quer\n");
scanf("%d %d", &numero, &n_bits);
converte(numero,n_bits);

exit(0);
}

So que a função nao esta  a converter os numeros correctamente

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bsccara    14
bsccara

1. Convém meteres um teste no início da função 'converte' para sair logo no caso de n_bits == 0. Já agora faz esse parâmetro 'unsigned'.

2. A variável 'aux', com o seu código associado, não serve para nada.

3. O código que inicializa a variável 'and' pode ser metido dentro do 'if' onde ela é testada, tornando essa variável também inútil.

4. Faz um 'right shift' (>>) da máscara no final do ciclo. Em vez de 'aux = num << 1;'  faz 'mascara >>= 1;'.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
einstein    0
einstein

1. Convém meteres um teste no início da função 'converte' para sair logo no caso de n_bits == 0. Já agora faz esse parâmetro 'unsigned'.

2. A variável 'aux', com o seu código associado, não serve para nada.

3. O código que inicializa a variável 'and' pode ser metido dentro do 'if' onde ela é testada, tornando essa variável também inútil.

4. Faz um 'right shift' (>>) da máscara no final do ciclo. Em vez de 'aux = num << 1;'  faz 'mascara >>= 1;'.

Muito obrigado. O programa já funciona :) . . .  Para poder ser com numeros com sinal como poderei fazer?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1134
HappyHippyHippo

depende do tipo de codificação do número negativo  ...

no entanto bastará apresentar um '1' ao início se for negativo ou '0' caso contrário

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
einstein    0
einstein

depende do tipo de codificação do número negativo  ...

no entanto bastará apresentar um '1' ao início se for negativo ou '0' caso contrário

-Quero apresentar em complemento para 2. Eu aqui quando introduzo numeros negativos ele apresenta-me em complemento para 2 pqe?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bsccara    14
bsccara

Se queres apresentar em complemento para 2 não precisas de fazer nada; os inteiros negativos já são representados internalmente assim. Muda só o parâmetro 'num' para 'int'.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
einstein    0
einstein

Se queres apresentar em complemento para 2 não precisas de fazer nada; os inteiros negativos já são representados internalmente assim. Muda só o parâmetro 'num' para 'int'.

ok.

Para converter para BCD como posso fazer? Separar os numeros em decimal e converter para binario? Se sim como posso separar os numeros em decimla?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bsccara    14
bsccara

O mais simples mas menos eficiente seria usar o 'sprintf' para converter o número para uma string e depois converter, caracter a caracter, para BCD. O mais eficiente, em processadores x86, seria usar instruções do FPU para fazer a conversão :

FILD valor_inteiro
FBSTP valor_BCD

em que 'valor_inteiro' é uma posição de memória onde estaria guardado o valor a converter e 'valor_BCD' é outra posição que iria receber uma sequência BCD de 18 digitos, com sinal no bit mais significativo e 10 bytes no total. Mas isto já não tem nada a ver com C.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
einstein    0
einstein

O mais simples mas menos eficiente seria usar o 'sprintf' para converter o número para uma string e depois converter, caracter a caracter, para BCD. O mais eficiente, em processadores x86, seria usar instruções do FPU para fazer a conversão :

FILD valor_inteiro
FBSTP valor_BCD

em que 'valor_inteiro' é uma posição de memória onde estaria guardado o valor a converter e 'valor_BCD' é outra posição que iria receber uma sequência BCD de 18 digitos, com sinal no bit mais significativo e 10 bytes no total. Mas isto já não tem nada a ver com C.

O sprintf nao e para escrever numa string?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

O sprintf nao e para escrever numa string?

Sim.

Usas o sprintf para converter um valor numa string

char texto[100];
int valor = 8042;
sprintf(texto, "%d", valor); /* texto tem "8072" */

Depois convertes para BCD

unsigned char bcd[100];
unsigned char *pb = bcd;
char *pt = texto;
while (*texto) {
  *pb = *pt - '0';
  pb++;
  pt++;
}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
einstein    0
einstein

outra solução seria :

void printBinary(int number, int bits) {
   ...
}

void printPacketBCD(int number) {
  int digit;
  while(i != 0) {
    digit = i % 10;
    i /= 10;
    printBinary(digit, 4);
  }
}

http://en.wikipedia.org/wiki/Binary-coded_decimal

Na tua funçao de "printPacketBCD" nao estas a usar o argumento number . O digit nao devia ser igual ao number/10? e o i? O que é que aquela expressão faz?

Porque usas unsigned char? O que "char *pt=texto" , o que faz o *?

Sim.

Usas o sprintf para converter um valor numa string

char texto[100];
int valor = 8042;
sprintf(texto, "%d", valor); /* texto tem "8072" */

Depois convertes para BCD

unsigned char bcd[100];
unsigned char *pb = bcd;
char *pt = texto;
while (*texto) {
  *pb = *pt - '0';
  pb++;
  pt++;
}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1134
HappyHippyHippo

Na tua funçao de "printPacketBCD" nao estas a usar o argumento number . O digit nao devia ser igual ao number/10? e o i? O que é que aquela expressão faz?

sim .. troca number por i e fica bem

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1134
HappyHippyHippo
void printPacketBCD(int i) { // i = numero a ser apresentado
  int digit;
  while(i != 0) {
    digit = i % 10;
    i /= 10;
    printBinary(digit, 4);
  }
}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
einstein    0
einstein

void printPacketBCD(int i) { // i = numero a ser apresentado
  int digit;
  while(i != 0) {
    digit = i % 10;
    i /= 10;
    printBinary(digit, 4);
  }
}

certo. desculpa a minha nabice mas o que faz o i/=10?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bsccara    14
bsccara

Podes mudar o algoritmo para dividir pela maior potência de 10 que te interessar para a número de bits (sabes que cada digito usa 4), usar o resultado da divisão como digito BCD e o resto para continuar o cálculo. A cada passo divides o divisor por 10.

Imagina 35650; divides por 10000 -> 3 em BCD, segue 5650; divides por 1000 -> 5 em BCD, segue 650 e por aí fora.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade