Foros del Web » Programación para mayores de 30 ;) » .NET »

Lista de números binarios c#

Estas en el tema de Lista de números binarios c# en el foro de .NET en Foros del Web. Hola a todos, quería consultarles lo siguiente: estoy intentando traducir la mayoría de mis códigos de java a c# para agarrarle la práctica, con un ...
  #1 (permalink)  
Antiguo 08/11/2018, 20:28
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 12 años, 11 meses
Puntos: 6
Lista de números binarios c#

Hola a todos, quería consultarles lo siguiente: estoy intentando traducir la mayoría de mis códigos de java a c# para agarrarle la práctica, con un número que me lista de números binarios según la longitud.

Sólo que el problema que tengo es que cuando escribo valores mayores a 30 no arranca a listar los binarios, pongo el código:

Código C#:
Ver original
  1. using System;
  2. namespace _11_FOR
  3. {
  4.     class Program {
  5.         /**
  6.          * Código de: http://www.solveet.com/exercises/Tabla-de-verdad-en-Binario/339/solution-2144
  7.          *
  8.          * 11. Programa en Java que da la lista de numeros en Binario según una longitud
  9.          * introducida por el usuario. Usando la funcion Integer.toBinaryString(int num).
  10.         */
  11.         static void Main(string[] args) {
  12.             Console.Clear();
  13.             Console.WriteLine("Introduce la cantidad de dígitos: ");
  14.             int longitud = Convert.ToInt32(Console.ReadLine());
  15.             String numBin = "";
  16.             //2 elevado al valor ingresado
  17.             /* */
  18.             int pot = (int)Math.Pow(2, longitud);
  19.             for(int i = 0; i < pot ;i++){
  20.                 // pasa el valor de decimal a binario
  21.                 //numBin = Int32.toBinaryString(i);
  22.                 numBin = Convert.ToString(i, 2);
  23.                 /*
  24.                     uso el while para ir agregando caracteres hasta llegar
  25.                     al largo ingresado
  26.                 */
  27.                 /*
  28.                 while(numBin.Length < longitud){
  29.                     numBin = 0 + numBin;
  30.                 } */
  31.                 Console.WriteLine(numBin);
  32.             }
  33.         }
  34.     }
  35. }

Espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #2 (permalink)  
Antiguo 09/11/2018, 04:18
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 9 meses
Puntos: 73
Respuesta: Lista de números binarios c#

No soy experto en C#, pero creo que tu problema es consecuencia del tamaño de los números enteros.

Dado que veo que hay una llamada al método Convert.ToInt32, deduzco que estás usando enteros de 32 bits. Si se trata de enteros con signo, el bit más significativo es el de signo, con lo que te quedan 31 bits para el entero en sí. Por eso, cuando introduzcas valores mayores que 31, cuando haces

int pot = (int)Math.Pow(2, longitud);

estás forzando una conversión a entero de un valor que rebasa el rango de valores de un número entero, con lo que el resultado obtenido se parecerá poco o nada a lo que debiera ser.
  #3 (permalink)  
Antiguo 09/11/2018, 20:21
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 12 años, 11 meses
Puntos: 6
Respuesta: Lista de números binarios c#

Hola Fw190 solucioné en parte el problema, cambié a pot de int a double y me muestra bien según la longitud, ahora tengo el problema que cuando el ingreso sobrepasa a 20, digamos 30, 40 o mucho más nunca termina de recorrer la lista de números binarios, pongo el código:

Código C#:
Ver original
  1. using System;
  2. namespace _11_FOR
  3. {
  4.     class Program {
  5.         /**
  6.          * Código de: http://www.solveet.com/exercises/Tabla-de-verdad-en-Binario/339/solution-2144
  7.          *
  8.          * 11. Programa en Java que da la lista de numeros en Binario según una longitud
  9.          * introducida por el usuario. Usando la funcion Integer.toBinaryString(int num).
  10.         */
  11.         static void Main(string[] args) {
  12.             Console.Clear();
  13.             Console.WriteLine("Introduce la cantidad de dígitos: ");
  14.             int longitud = Convert.ToInt32(Console.ReadLine());
  15.             String numBin = "";
  16.             //2 elevado al valor ingresado
  17.             /* */
  18.             double pot = Math.Pow(2, longitud);
  19.             for(int i = 0; i < pot ;i++){
  20.                 Console.WriteLine(Convert.ToString(i, 2));
  21.                 // pasa el valor de decimal a binario
  22.                 //numBin = Int32.toBinaryString(i);
  23.                 numBin = Convert.ToString(i, 2);
  24.                 /*
  25.                     uso el while para ir agregando caracteres hasta llegar
  26.                     al largo ingresado
  27.                 */                
  28.                 while(numBin.Length < longitud){
  29.                     numBin = 0 + numBin;
  30.                 }
  31.                 Console.WriteLine(numBin);
  32.             }
  33.         }
  34.     }
  35. }

Espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #4 (permalink)  
Antiguo 13/11/2018, 13:32
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 9 meses
Puntos: 73
Respuesta: Lista de números binarios c#

Si el valor de pot supera al de un entero, por mucho que incrementes i nunca alcanzarás el valor de pot, ya que, cuando i llegue al entero máximo, en el próximo incremento empieza a tomar valores negativos, con lo que nunca se cumple la condición de salida del bucle.

Te pongo un ejemplo para enteros de 16 bits. Tendríamos un rango de -32768 a +32767. Si yo introduzco una longitud de 18, Math.Pow(2,18) = 262144, y mi bucle tendría que ir de 0 a 262143. Pero, al alcanzar i el valor de 32767, en el siguiente incremento la combinación de bits resultante corresponderá a un valor de i = -32768, con lo que el bucle sigue incrementando i hasta volver a llegar a +32767, y vuelta a empezar. Es decir, mi problema aparecería con longitudes superiores a 15.

Resumiendo, tal como has hecho el programa, el límite te lo da el tamaño en bits de un entero.

¿Solución? Si tienes enteros de 64 bits (no sé si C# dispone de este tipo de enteros), el problema te aparecerá con longitudes superiores a 63. Otra solución sería el empleo de librerías de precisión arbitraria, buscando en internet encontrarás unas cuantas, aunque no sé si las hay para C#.

Saludos,
  #5 (permalink)  
Antiguo 17/11/2018, 22:30
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 12 años, 11 meses
Puntos: 6
Respuesta: Lista de números binarios c#

Hola Fw190, gracias por responder ante lo que me dijiste se me ocurrió que en cada incremento poner un if que si i < 0 entonces i *= -1 en caso de ser negativo pase a positivo, probé en 18, 25 pero de 30, 40 queda muy lento, pongo el código:

Código C#:
Ver original
  1. using System;
  2. namespace _11_FOR
  3. {
  4.     class Program {
  5.         /**
  6.          * Código de: http://www.solveet.com/exercises/Tabla-de-verdad-en-Binario/339/solution-2144
  7.          *
  8.          * 11. Programa en Java que da la lista de numeros en Binario según una longitud
  9.          * introducida por el usuario. Usando la funcion Integer.toBinaryString(int num).
  10.         */
  11.         static void Main(string[] args) {
  12.             Console.Clear();
  13.             Console.WriteLine("Introduce la cantidad de dígitos: ");
  14.             int longitud = Convert.ToInt32(Console.ReadLine());
  15.             String numBin = "";
  16.             //2 elevado al valor ingresado
  17.             /* */
  18.             double pot = Math.Pow(2, longitud);
  19.             for(int i = 0; i < pot ;i++){
  20.                 if(i < 0){
  21.                     i *= -1;
  22.                 }
  23.                 // pasa el valor de decimal a binario
  24.                 //numBin = Int32.toBinaryString(i);
  25.                 numBin = Convert.ToString(i, 2);
  26.                 /*
  27.                     uso el while para ir agregando caracteres hasta llegar
  28.                     al largo ingresado
  29.                 */                
  30.                 while(numBin.Length < longitud){
  31.                     numBin = 0 + numBin;
  32.                 }
  33.                 Console.WriteLine(numBin);
  34.             }
  35.         }
  36.     }
  37. }

¿Existe una forma de hacer más rápido los recorridos? porque en java tengo el mismo problema.

Espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #6 (permalink)  
Antiguo 19/11/2018, 04:37
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 9 meses
Puntos: 73
Respuesta: Lista de números binarios c#

Para empezar, irá más lento porque en el bucle tienes una comparación y, posiblemente, una operación aritmética adicionales.

Por otra parte, tampoco te servirá de mucho, dado que, cuando te aparezcan números negativos, al multiplicar por -1 lo que vas a obtener son números positivos que ya previamente habías recorrido en el bucle, con lo que obtendrás resultados que ya habías obtenido previamente.

Además, estás modificando dentro del bucle la variable que lo controla, lo cual es muy poco recomendable.

Como ya te comenté, el límite te lo da el tamaño de un entero. Para enteros de 32 bits con signo, su rango de valores va desde -2^31 a 2^31-1 (de -2147483648 a 2147483647), es decir, la máxima longitud que podrías introducir es de 30. Si el entero es sin signo, el rango de valores es desde 0 a 2^32-1 (0 a 4294967295), y la máxima longitud que podrás introducir es 31. Para enteros de 64 bits (si dispones de ellos), estas longitudes máximas serán de 62 para enteros con signo, y de 63 para enteros sin signo.

Saludos,
  #7 (permalink)  
Antiguo 19/11/2018, 04:37
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 9 meses
Puntos: 73
Respuesta: Lista de números binarios c#

Para empezar, irá más lento porque en el bucle tienes una comparación y, posiblemente, una operación aritmética adicionales.

Por otra parte, tampoco te servirá de mucho, dado que, cuando te aparezcan números negativos, al multiplicar por -1 lo que vas a obtener son números positivos que ya previamente habías recorrido en el bucle, con lo que obtendrás resultados que ya habías obtenido previamente.

Además, estás modificando dentro del bucle la variable que lo controla, lo cual es muy poco recomendable.

Como ya te comenté, el límite te lo da el tamaño de un entero. Para enteros de 32 bits con signo, su rango de valores va desde -2^31 a 2^31-1 (de -2147483648 a 2147483647), es decir, la máxima longitud que podrías introducir es de 30. Si el entero es sin signo, el rango de valores es desde 0 a 2^32-1 (0 a 4294967295), y la máxima longitud que podrás introducir es 31. Para enteros de 64 bits (si dispones de ellos), estas longitudes máximas serán de 62 para enteros con signo, y de 63 para enteros sin signo.

Saludos,


(ops... he mandado dos veces la misma respuesta)
  #8 (permalink)  
Antiguo 24/11/2018, 22:06
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 12 años, 11 meses
Puntos: 6
Respuesta: Lista de números binarios c#

Hola FW190 gracias por responder, me dejaste pensativo:

Cita:
Como ya te comenté, el límite te lo da el tamaño de un entero. Para enteros de 32 bits con signo, su rango de valores va desde -2^31 a 2^31-1 (de -2147483648 a 2147483647), es decir, la máxima longitud que podrías introducir es de 30. Si el entero es sin signo, el rango de valores es desde 0 a 2^32-1 (0 a 4294967295), y la máxima longitud que podrás introducir es 31. Para enteros de 64 bits (si dispones de ellos), estas longitudes máximas serán de 62 para enteros con signo, y de 63 para enteros sin signo.
Al final lo puse como uint y de 32, así me rindo con esto de los límites.

Cita:
Por otra parte, tampoco te servirá de mucho, dado que, cuando te aparezcan números negativos, al multiplicar por -1 lo que vas a obtener son números positivos que ya previamente habías recorrido en el bucle, con lo que obtendrás resultados que ya habías obtenido previamente.
Borré esa condición por relleno, cómo habías dicho.

Pero.....

Cita:
Para empezar, irá más lento porque en el bucle tienes una comparación y, posiblemente, una operación aritmética adicionales.
...
Además, estás modificando dentro del bucle la variable que lo controla, lo cual es muy poco recomendable.
Cuando encontré este código lo puse tal cual cómo estaba en Java, no se me ocurriría otra forma de resolverlo.

Espero sus respuestas y Saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias

Etiquetas: lista
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:05.