| 
	
		|  Autor | Tema: De decimal a binario sumando sólo los bits encendidos [C].  (Leído 3,332 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 amory 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 = 1000ciclo 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.ivancea96
 bits = 2^(sizeof(int)*8-1)
 (?)
  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 amory 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 llamabavalidar 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 amory 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 | 25,187 |  9 Julio 2010, 17:52 pm por Debci
 |  
						|   |   | Pasar decimal a binario .NET (C#, VB.NET, ASP)
 | Cuasar | 7 | 8,868 |  8 Febrero 2011, 04:00 am por Cuasar
 |  
						|   |   | [BATCH] Decimal > Binario Scripting
 | Puntoinfinito | 7 | 9,955 |  17 Mayo 2019, 13:02 pm por d.gromero
 |  
						|   |   | swing binario decimal Java
 | winnipu | 2 | 3,861 |  19 Mayo 2014, 18:36 pm por winnipu
 |  
						|   |   | Convertir en binario a Hex y Decimal. .NET (C#, VB.NET, ASP)
 | Meta | 3 | 4,331 |  24 Agosto 2014, 19:46 pm por Meta
 |    |