• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Sign in to follow this  
Followers 0
einstein

Conversao de dois numeros para binario

27 posts in this topic

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?

0

Share this post


Link to post
Share on other sites

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?

0

Share this post


Link to post
Share on other sites

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.

0

Share this post


Link to post
Share on other sites

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.

0

Share this post


Link to post
Share on other sites

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.

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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;'.

0

Share this post


Link to post
Share on other sites

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?

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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?

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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?

0

Share this post


Link to post
Share on other sites

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.

0

Share this post


Link to post
Share on other sites

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?

0

Share this post


Link to post
Share on other sites

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++;
}

0

Share this post


Link to post
Share on other sites

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++;
}

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

sim .. troca number por i e fica bem

o i é suposto fazer o que?

0

Share this post


Link to post
Share on other sites
void printPacketBCD(int i) { // i = numero a ser apresentado
  int digit;
  while(i != 0) {
    digit = i % 10;
    i /= 10;
    printBinary(digit, 4);
  }
}

0

Share this post


Link to post
Share on other sites

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?

0

Share this post


Link to post
Share on other sites

i = i / 10;

Ok. Muito obrigado :P

So que os numeros sao escritos por ordem inversa dos algarismos.

0

Share this post


Link to post
Share on other sites

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.

0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0