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

einstein

Conversao de dois numeros para binario

27 mensagens neste tópico

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim .. troca number por i e fica bem

o i é suposto fazer o que?

0

Partilhar esta mensagem


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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

i = i / 10;

Ok. Muito obrigado :P

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

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