Ir para conteúdo


- - - - -

Conversao de dois numeros para binario


  • Por favor inicie sessão para responder
26 respostas a este tópico

#1 einstein

einstein

    void

  • Membro
  • PipPip
  • 88 mensagens

Publicado 05 de Abril de 2012 - 14:56

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?

#2 pmg

pmg

    Unsigned User

  • Moderador
  • PipPipPipPipPipPip
  • 3688 mensagens

Publicado 05 de Abril de 2012 - 15:01

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?

#3 einstein

einstein

    void

  • Membro
  • PipPip
  • 88 mensagens

Publicado 05 de Abril de 2012 - 15:08

Ver Mensagempmg, em 05 de Abril de 2012 - 15:01, disse:

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.

#4 pmg

pmg

    Unsigned User

  • Moderador
  • PipPipPipPipPipPip
  • 3688 mensagens

Publicado 05 de Abril de 2012 - 15:18

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

Código (C):
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
Código (C):
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.

#5 einstein

einstein

    void

  • Membro
  • PipPip
  • 88 mensagens

Publicado 05 de Abril de 2012 - 15:22

Ver Mensagempmg, em 05 de Abril de 2012 - 15:18, disse:

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

Código (C):
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
Código (C):
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.

#6 HappyHippyHippo

HappyHippyHippo

    Stack Overflow

  • Membro
  • PipPipPipPipPipPipPip
  • 10486 mensagens

Publicado 05 de Abril de 2012 - 16:19

algo deste género ??
Código (C):
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

#7 einstein

einstein

    void

  • Membro
  • PipPip
  • 88 mensagens

Publicado 20 de Abril de 2012 - 21:15

Ainda nao consegui perceber como se faz este programa o código que fiz foi o seguinte Código :
#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

#8 bsccara

bsccara

    Try-Catch User

  • Membro
  • PipPipPipPip
  • 482 mensagens

Publicado 20 de Abril de 2012 - 21:29

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

#9 einstein

einstein

    void

  • Membro
  • PipPip
  • 88 mensagens

Publicado 20 de Abril de 2012 - 21:54

Ver Mensagembsccara, em 20 de Abril de 2012 - 21:29, disse:

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?

#10 HappyHippyHippo

HappyHippyHippo

    Stack Overflow

  • Membro
  • PipPipPipPipPipPipPip
  • 10486 mensagens

Publicado 20 de Abril de 2012 - 22:03

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

#11 einstein

einstein

    void

  • Membro
  • PipPip
  • 88 mensagens

Publicado 20 de Abril de 2012 - 22:38

Ver MensagemHappyHippyHippo, em 20 de Abril de 2012 - 22:03, disse:

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?

#12 bsccara

bsccara

    Try-Catch User

  • Membro
  • PipPipPipPip
  • 482 mensagens

Publicado 20 de Abril de 2012 - 23:07

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

#13 einstein

einstein

    void

  • Membro
  • PipPip
  • 88 mensagens

Publicado 20 de Abril de 2012 - 23:08

Ver Mensagembsccara, em 20 de Abril de 2012 - 23:07, disse:

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?

#14 bsccara

bsccara

    Try-Catch User

  • Membro
  • PipPipPipPip
  • 482 mensagens

Publicado 20 de Abril de 2012 - 23:38

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 :

Código (ASM):
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.

#15 einstein

einstein

    void

  • Membro
  • PipPip
  • 88 mensagens

Publicado 21 de Abril de 2012 - 00:49

Ver Mensagembsccara, em 20 de Abril de 2012 - 23:38, disse:

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 :

Código (ASM):
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?

#16 HappyHippyHippo

HappyHippyHippo

    Stack Overflow

  • Membro
  • PipPipPipPipPipPipPip
  • 10486 mensagens

Publicado 21 de Abril de 2012 - 03:12

outra solução seria :
Código (C):
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

#17 pmg

pmg

    Unsigned User

  • Moderador
  • PipPipPipPipPipPip
  • 3688 mensagens

Publicado 21 de Abril de 2012 - 10:39

Ver Mensagemeinstein, em 21 de Abril de 2012 - 00:49, disse:

O sprintf nao e para escrever numa string?

Sim.

Usas o sprintf para converter um valor numa string
Código (C):
char texto[100];
int valor = 8042;
sprintf(texto, "%d", valor); /* texto tem "8072" */

Depois convertes para BCD
Código (C):
unsigned char bcd[100];
unsigned char *pb = bcd;
char *pt = texto;
while (*texto) {
  *pb = *pt - '0';
  pb++;
  pt++;
}


#18 einstein

einstein

    void

  • Membro
  • PipPip
  • 88 mensagens

Publicado 21 de Abril de 2012 - 12:58

Ver MensagemHappyHippyHippo, em 21 de Abril de 2012 - 03:12, disse:

outra solução seria :
Código (C):
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?

Ver Mensagempmg, em 21 de Abril de 2012 - 10:39, disse:


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

Usas o sprintf para converter um valor numa string
Código (C):
char texto[100];
int valor = 8042;
sprintf(texto, "%d", valor); /* texto tem "8072" */

Depois convertes para BCD
Código (C):
unsigned char bcd[100];
unsigned char *pb = bcd;
char *pt = texto;
while (*texto) {
  *pb = *pt - '0';
  pb++;
  pt++;
}


#19 HappyHippyHippo

HappyHippyHippo

    Stack Overflow

  • Membro
  • PipPipPipPipPipPipPip
  • 10486 mensagens

Publicado 21 de Abril de 2012 - 13:08

Ver Mensagemeinstein, em 21 de Abril de 2012 - 12:58, disse:

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

#20 einstein

einstein

    void

  • Membro
  • PipPip
  • 88 mensagens

Publicado 21 de Abril de 2012 - 13:10

Ver MensagemHappyHippyHippo, em 21 de Abril de 2012 - 13:08, disse:

sim .. troca number por i e fica bem

o i é suposto fazer o que?