Autor
|
Tema: De decimal a binario sumando sólo los bits encendidos [C]. (Leído 2,912 veces)
|
DanielPy
Desconectado
Mensajes: 145
|
Hola a todos. Nuevamente con alguna duda y solicitando ayuda.- La duda es sobre cómo establecer el valor correcto de la variable bits, si bien practicando un poco tal vez lograría que si por ej. El ingreso es: 2147483648 en binario 10000000000000000000000000000000 Obtendría el resultado esperado pero no me quedaría claro por qué establecí dicho valor.- Me podrían decir el criterio que debo utilizar para establecer el valor correcto en la variable bits.- //Programa que convierte un número entero sin signo a binario. #include <stdio.h> #include <windows.h> #include <limits.h> void ingreso(); void decimalBinario(int numero); int main(void){ ingreso(); return 0; } void ingreso(){ int ingreso, ch=0, ok=0; do{ printf("\n\n Ingrese un entero sin signo en el rango de 1 a %d...: ", INT_MAX ); ok = scanf("%d", &ingreso ) == 1 && ingreso > 0 && ingreso <= INT_MAX ; while ((ch = getchar()) != EOF && ch != '\n'); }while(!ok); decimalBinario(ingreso); } void decimalBinario(int numero){ int bits=64, i, entero=0; for(i=0; bits > 0; i++){ if(numero & bits){ entero += bits; } else{ } bits /=2; } printf(" ==> decimal %d\n\n", entero ); }
Saludos. Daniel
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Plantéate poner while(bits>0) en vez del for.
bits = 2^(sizeof(int)*8-1) (?)
|
|
|
En línea
|
|
|
|
engel lex
|
en tu caso hiciste una comparación binaria, sin embargo hay cosas en tu codigo que deberían ser corregidas esto está mal ya que el numero más grande que puede calcular en binario es 64 for(i=0; bits > 0; i++){ if(numero & bits){ printf("1"); entero += bits; } else{ printf("0"); } bits /=2; } printf(" ==> decimal %d\n\n", entero);
cada ciclo ve si bits > 0, luego hace un and entre bits y el numero... (de estar bien) es algo así numero = 1000 ciclo 1: 1111101000 AND 1000000000 compara a 0 e imprime, luego divide bit/2 ciclo 2: 1111101000 AND 0100000000 compara a 0 e imprime, luego divide bit/2 ciclo 3: 1111101000 AND 0010000000 compara a 0 e imprime, luego divide bit/2 .... etc hasta que bit == 0
agrego:----- Plantéate poner while(bits>0) en vez del for.
bits = 2^(sizeof(int)*8-1) (?) ivancea96 recuerda que "^" es XOR, es mejor plantearlo como 1<<(sizeof(int)*8-1)
|
|
« Última modificación: 14 Febrero 2015, 18:59 pm por engel lex »
|
En línea
|
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
|
|
|
|
Blaster
Desconectado
Mensajes: 190
|
Si la idea es convertir cualquier entero sin signo a su equivalente binario, lo mas conveniente seria trabajar con unsigned mas en tu caso ya que 2147483648 ya no es representable por un simple int ya estaría provocando un desbordamiento de enteros. Y ahora para establecer la mascara de bit necesaria lo mas correcto (teniendo en cuenta lo dicho) y portable seria: unsigned bits = 1U << sizeof(unsigned) * CHAR_BIT - 1;
Un Saludo
|
|
« Última modificación: 14 Febrero 2015, 22:27 pm por Blaster »
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
La duda es sobre cómo establecer el valor correcto de la variable bits, si bien practicando un poco tal vez lograría que si por ej. El ingreso es: 2147483648 en binario ? 10000000000000000000000000000000 Obtendría el resultado esperado pero no me quedaría claro por qué establecí dicho valor.- Me podrían decir el criterio que debo utilizar para establecer el valor correcto en la variable bits. Algunos comentarios solo para redondear el tema: * No es necesario comparar el valor leído contra INT_MAX ya que no hay forma de que sea mayor que este, esa comparación la debes eliminar. * No es necesario calcular el valor ya que este ya lo tienes y lo pasas como argumento a la función "decimalBinario", otra cosa seria procesar una cadena con la representación del numero en base 2 y en base a esta obtener el numero. * No es necesario un contador para controlar el bucle de la función, en su lugar terminas este cuando la mascara sea cero: void decimalBinario(int numero) { unsigned bit = 1U << sizeof(unsigned) * CHAR_BIT - 1; while (bit){ bit >>= 1; } }
Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
DanielPy
Desconectado
Mensajes: 145
|
Hola a todos. Gracias a los cuatro por la ayuda que me brindan.- Adopte el while como me sugirieron, luego coloque la línea de código de Blaster (que es similar a la de ivancea96) y todo funciona.- BlackZeroX (Astaroth), no es mi fuerte el inglés.- * No es necesario comparar el valor leído contra INT_MAX ya que no hay forma de que sea mayor que este, esa comparación la debes eliminar. Esta línea no me cierra, si yo no efectuó esa comprobación el resultado es incorrecto.- Por último y para que no piensen que estoy desaparecido escribí esto, pero lo que le sigue en importancia para mí no lo pongo todavía porque ni se me antoja como preguntarlo, ya me caerá la ficha y además quiero practicar un poco para ver si lo logro.- Saludos. Daniel
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
No es necesario comparar el valor leído contra INT_MAX ya que no hay forma de que sea mayor que este, esa comparación la debes eliminar. Esta línea no me cierra, si yo no efectuó esa comprobación el resultado es incorrecto. Si te da un resultado incorrecto sera por alguna otra razón. Cuando llamas a scanf esta consume los caracteres de la entrada estándar y en base a ellos almacena un valor de tipo signed int en la variable en cuestion, ese valor siempre estará en el rango [INT_MIN, INT_MAX]. En todo caso si actualizaste el programa publica su código fuente de nuevo. Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
DanielPy
Desconectado
Mensajes: 145
|
Tenías toda la razón, como esto te lo copié de un post (mío) que si mal no recuerdo se llamaba validar ingreso de datos en c no le di más vueltas al asunto y creí que debía emplearlo siempre.- De cualquier manera dejo la foto del código que estoy finalizando con los apuntes complementarios para luego repasarlos.- Saludos. Daniel
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[ code=C++] Conversor binario-decimal-binario
« 1 2 »
Programación C/C++
|
Chonk
|
11
|
24,254
|
9 Julio 2010, 17:52 pm
por Debci
|
|
|
Pasar decimal a binario
.NET (C#, VB.NET, ASP)
|
Cuasar
|
7
|
8,193
|
8 Febrero 2011, 04:00 am
por Cuasar
|
|
|
[BATCH] Decimal > Binario
Scripting
|
Puntoinfinito
|
7
|
9,186
|
17 Mayo 2019, 13:02 pm
por d.gromero
|
|
|
swing binario decimal
Java
|
winnipu
|
2
|
3,636
|
19 Mayo 2014, 18:36 pm
por winnipu
|
|
|
Convertir en binario a Hex y Decimal.
.NET (C#, VB.NET, ASP)
|
Meta
|
3
|
4,032
|
24 Agosto 2014, 19:46 pm
por Meta
|
|