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: 391
Antigüedad: 7 años, 7 meses
Puntos: 4
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: 617
Antigüedad: 8 años, 5 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: 391
Antigüedad: 7 años, 7 meses
Puntos: 4
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: 617
Antigüedad: 8 años, 5 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 Ayer, 22:30
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 391
Antigüedad: 7 años, 7 meses
Puntos: 4
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



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