Jump to content

Conversao de dois numeros para binario


einstein
 Share

Recommended Posts

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?

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
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.

Link to comment
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.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
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.

Link to comment
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

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
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

Link to comment
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;'.

Link to comment
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?

Link to comment
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?

Link to comment
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?

Link to comment
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.

Link to comment
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?

Link to comment
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++;
}

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
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++;
}

Link to comment
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
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.