| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
hipno_12
Registrado: 10 Oct 2007 Mensajes: 5
| Publicado: 22/10/2007 2:24 pm | | | Título: ayuda para acabar un programa que no tengo idea de com se ha |
| es un programa en dev c++ el cual convierta un numero a binario pero la verdad no se ni como esto es lo unico que llevo#include <stdio.h> #include <conio.h>
main() { int b,a,c,s,d,e; printf("un numero binario\n"); do { printf("dame el valor a comvertir"); scanf("%d",&a); do { b=a/2; c=a%2; d=b%2; e=b; printf("%d,%d",c,d); } while(e<0); printf("quiere realizar otro numero\n1)si\n2)no\n:"); scanf("%d",&s); } while(s==1); getch(); } |
| | Volver arriba | |  | daltomi
Registrado: 28 Abr 2007 Mensajes: 114 Ubicación: Argentina
| Publicado: 22/10/2007 3:27 pm | | | Título: |
| Para mostrar por pantalla un número en su correspondiente valor binario, se puede utilizar el desplazamiento de bit's.
Observa éste ejemplo:
| Código: | void VisualizaBits(unsigned Numero) { unsigned i; unsigned Mascara = 128;
for(i=1; i<=8; i++){ if(Numero & Mascara) { cout.put('1'); }else{ cout.put('0'); } Numero<<= 1; cout.put(' '); } cout<<endl; }
|
Lo encontré en la Red, asi que voy a tratar de explicarlo:
Como necesitamos comparar sólo un bit por vez en cada operación AND(&), nesecitamos un número que contenga un bit en 1 y los demás en 0, teniendo en cuenta que un BYTE es igual a 8 bit:
Es decir desplazamos el valor 00000001b unos 7 lugares a la izquierda, que es lo mismo:
| Código: | unsigned Mascara = 1 << 7;
|
Ahora directamente a la función:
| daltomi escribió: |
Teniendo en cuenta que:
Mascara -> 128d == 10000000b (constante) Numero -> 9d == 00001001b (como ejemplo) ----------------------------
Comparación AND alineado con desplazamiento a la izquierda de Numero.
Itera 1: 10000000b Mascara 00001001b Numero --------- 00000000b -> 0d
Itera 2: 10000000b Mascara 00010010b Numero = Numero << 1 --------- 00000000b -> 0d
Itera 3: 10000000b Mascara 00100100b Numero = Numero << 1 --------- 00000000b -> 0d
Itera 4: 10000000b Mascara 01001000b Numero = Numero << 1 --------- 00000000b -> 0d
Itera 5: 10000000b Mascara 10010000b Numero = Numero << 1 --------- 10000000b -> 128d
Itera 6: 10000000b Mascara 00100000b Numero = Numero << 1 --------- 00000000b -> 0d
Itera 7: 10000000b Mascara 01000000b Numero = Numero << 1 --------- 00000000b -> 0d
Itera 8: 10000000b Mascara 10000000b Numero = Numero << 1 --------- 10000000b -> 128d
Dado los resultados en cada iteración, podemos "concatenar" dichos resultados: 1: 0 y 2: 0 y 3: 0 y 4: 0 y 5: 1 y 6: 0 y 7: 0 y 8: 1
Resultado en pantalla: "00001001"
|
Saludos. |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 3650 Ubicación: Mexico
| Publicado: 22/10/2007 3:55 pm | | | Título: |
| Para "convertir" un numero de decimal a binario tienes que dividirlo repetidamente entre dos. En cada iteracion el residuo de la division te dara el bit menos significativo.
Esta operacion se puede realizar de varias formas por ejemplo utilizando el operador de residuo (el '%') en la division entre enteros o utilizando el operadores a nivel de bits.
Un ejemplo relativamente sencillo de esto utilizando el operador de residuo y aritmetica de punteros (para no tener que invertir el resultado) es (C estandar):
| Código: | #include <stdio.h> #include <stdlib.h> #include <limits.h>
#define NUM_BITS ((int) sizeof(int) * CHAR_BIT)
int main(void) { char binario[NUM_BITS + 1]; /* +1 para el '\0' */ char *p; unsigned numero; int aux; printf("Introduce un numero positivo: "); fflush(stdout); if (scanf("%u", &numero) != 1) return EXIT_FAILURE; p = binario + NUM_BITS; aux = numero; do { *--p = '0' + (aux % 2); }while ((aux /= 2) > 0); binario[NUM_BITS] = '\0'; printf("%u == %s\n", numero, p); return EXIT_SUCCESS; } |
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | | spesmod
Registrado: 23 Ago 2007 Mensajes: 33
| Publicado: 23/10/2007 9:35 am | | | Título: |
| esta es otra posible opcion,,,
| Código: | #include<stdio.h> #include<conio.h> #include<math.h> #include <stdlib.h>
void vcb(int a, int m[]); int bindec(int m[]);
main() { int j, c_bin[8];
clrscr(); printf("ESCRIBE UN NUMERO\n"); scanf("%i", &j); vcb(j,c_bin); ////>>>IMPRIME EL CODIGO BINARIO printf("\n%i",bindec(c_bin)); ////>>>TOMA EL CODIGO BINARIO ////>>>Y LO VUELVE DECIMAL ////>>>(a manera de comprobacion). getch();
return 0; }
void vcb(int a, int m[]) { for(int i=7; i>=0; i--) { m[i]=a%2; a=a/2; } for(i=0;i<=7;i++) printf("%i",m[i]); }
int bindec(int m[]) { int k, l=0; for(k=7;k>=0;k--) l=(m[7-k]*pow(2,k))+l; return l; }
|
pero aqui he puesto dos funciones:
| Código: | void vcb(int a, int m[]); |
permite VerCodigoBinario de un numero; por eso se llama vcb, y almacena cada valor en un array de 8 elementos, al finalizar la fucion, al cada elemento contiene a un 1 o 0 dependiendo del numero ingresado.
la otra funcion:
| Código: | int bindec(int m[]); |
hace lo opuesto... recibe una matriz de 8 elementos obviamente estos son unos o ceros, y los convierte en un valor entero, y devuelve dicho valor, puede ser que esa funcion tambien te sirva, asi que bueno ps espero ayudaros. _________________ |--A--Q--U--A--|
|
| | Volver arriba | |  | cheroky
Registrado: 22 Sep 2005 Mensajes: 1372 Ubicación: En ecx esperando un call
| Publicado: 23/10/2007 1:54 pm | | | Título: |
| También puedes usar una macro que te permite visualizar un determinado bit en una determinada posición, aplicando esta macro sobre un bucle permite visualizar todo el rango.
| Código: | #include <stdio.h> #include <limits.h>
#define PUTBIT(var, pos) !!((var) & 1 << (pos))
int main() { int i = sizeof(i) * CHAR_BIT; int v = 0x29A; while(i--) { putchar( PUTBIT(v ,i) + '0' ); if( i % CHAR_BIT == 0 ) putchar(' '); }
return 0; } |
Y otra forma muy eficiente con doble desplazamiento, siempre y cuando se use el tamaño de palabra del procesador o se trunque a ese tamaño.
| Código: | #include <stdio.h> #include <limits.h> #define PUTBIT(var ,pos ) ((var) <<(pos)>> (sizeof(var) * CHAR_BIT)-1)
int main() {
unsigned var = 0x29A; int pos = 0; while( pos < sizeof(var) * CHAR_BIT ) { printf("%d", PUTBIT(var, pos)); pos++; if( pos % CHAR_BIT == 0 ) putchar(' '); } return 0; } |
S2. _________________ - Explícito es mejor que implícito. - Simple es mejor que complejo. - Complejo es mejor que complicado. - Plano es mejor que anidado. - Ralo es mejor que denso. |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |