Conversao de dois numeros para binario - C - Portugal-a-Programar
Conversao de dois numeros para binario
Por einstein, 5 de Abril de 2012 em C
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?
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.
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.
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);
PS : agora vi que estou a apresentar do menos significativo para o mais significativo .... deverás alterar a ordem de apresentação
Ainda nao consegui perceber como se faz este programa o código que fiz foi o seguinte
void converte(unsigned int num, int n_bits) {
int mascara=0;
mascara= 1 << (n_bits-1);
while(n_bits>0){
and= num & mascara;
if (and==0){
aux=num<<1;
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);
So que a função nao esta a converter os numeros correctamente
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?
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?
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'.
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?
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?
outra solução seria :
void printBinary(int number, int bits) {
void printPacketBCD(int number) {
printBinary(digit, 4);
Usas o sprintf para converter um valor numa string
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';
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 .. troca number por i e fica bem
o i é suposto fazer o que?
void printPacketBCD(int i) { // i = numero a ser apresentado
certo. desculpa a minha nabice mas o que faz o i/=10?
So que os numeros sao escritos por ordem inversa dos algarismos.
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.