elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ¿Error al convertir nùmero grande a binario?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Error al convertir nùmero grande a binario?  (Leído 2,037 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.584


Hackentifiko!


Ver Perfil
¿Error al convertir nùmero grande a binario?
« en: 8 Julio 2025, 10:53 am »

En el dibujo de arriba izquierda:

debería formarse esto:

es como una L reflejada verticalmente.
pero como ven, está mal.

Ahí hay 7*7 dibujos (cuadros) compuestos de 8*8 cuadraditos cada uno.

El problema ocurre con esos números, no ocurre con números menores como
2 y 3
3 y 4
...
6 y 7
como ven siempre pongo que CuadrosPorFila = CuadraditosPorFila-1

Creo que el problema está en cómo se genera la variable DibujoaMostrar, en esta función, que se usa al inicio y cada vez que cambian esos números:
Código
  1. function AjustarVariables () {
  2. Cuadros = CuadrosPorFila*CuadrosPorFila;
  3. MaxCuadro = Cuadros-1;
  4. Cuadraditos = CuadraditosPorFila*CuadraditosPorFila;
  5. MaxCuadradito = Cuadraditos-1;
  6. LargoDeCuadraditos = 384/(CuadraditosPorFila*CuadrosPorFila+CuadrosPorFila-1);
  7. LargoDeCuadros = CuadraditosPorFila*LargoDeCuadraditos;
  8. // Esto es para que el 1er dibujo sea una L al revés...
  9. // Se averigua su número representante en binario:
  10. // Para formar la _
  11. DibujoEnBinario = String(Math.round(Math.pow(10, CuadraditosPorFila)));
  12. // Quitar el 1:
  13. DibujoEnBinario = DibujoEnBinario.substring(1, CuadraditosPorFila+1);
  14. // Esto forma las filas siguientes, con el 1ero pintado:
  15. NroDelCaracter = Cuadraditos-CuadraditosPorFila;
  16. AnterioraPintar = MaxCuadradito-CuadraditosPorFila;
  17. do {
  18. NroDelCaracter--;
  19. if (NroDelCaracter != AnterioraPintar) {
  20. DibujoEnBinario = 1+DibujoEnBinario;
  21. } else {
  22. DibujoEnBinario = 0+DibujoEnBinario;
  23. AnterioraPintar = AnterioraPintar-CuadraditosPorFila;
  24. }
  25. } while (NroDelCaracter>0);
  26. // trace("DibujoEnBinario que hace la L invertida: "+DibujoEnBinario);
  27. // Convertirlo en decimal:
  28. DibujoaMostrar = 0;
  29. do {
  30. DibujoaMostrar = DibujoaMostrar+(Number(DibujoEnBinario.charat(NroDelCaracter))*Math.pow(2, DibujoEnBinario.length-1-NroDelCaracter));
  31. NroDelCaracter++;
  32. } while (NroDelCaracter<Cuadraditos);
  33. DibujoaMostrar = Number(DibujoaMostrar);
  34. trace("DibujoaMostrar calculado desde la L invertida: "+DibujoaMostrar);
  35. }

Porque tengo una función que convierte DibujoaMostrar a binario y...

Si CuadroPorFila es 2 y CuadraditosPorFila es 3, la conversión dice:
Convirtiendo a binario esto: 432
DibujoEnBinario: 110110000
y está bien, vean que tiene 4 0s al final. Los dibujos se muestran al revés a eso, o sea:
000
011
011
y 0 es negro, vean que se forma la ┌
son 3 0s y uno más que sigue en la siguiente fila. 4.

Si pongo 3 y 4:
Convirtiendo a binario esto: 61152
DibujoEnBinario: 1110111011100000
5 0s, la cantidad de 0s aumentó 1.

Con 4 y 5:
Convirtiendo a binario esto: 32472000
DibujoEnBinario: 1111011110111101111000000
6, de nuevo aumentó 1.

5 y 6:
Convirtiendo a binario esto: 67628691328
DibujoEnBinario: 111110111110111110111110111110000000
7, de nuevo +1.

6 y 7:
Convirtiendo a binario esto: 558517276622592
DibujoEnBinario: 1111110111111011111101111110111111011111100000000
8, de nuevo +1.

7 y 8:
Convirtiendo a binario esto: 1.83744039008715e+19
DibujoEnBinario: 1111111011111110111111101111111011111110111111110000000000000000
Con esto ocurre el problema. Vean que en 1er lugar el número se muestra raro, y el binario en vez de tener 9 0s al final tiene 16.
Creo haber confirmado que la función que convierte a binario no es el problema, falla porque se le da ese número raro.

¿Se puede corregir el error o es un número muy largo y por eso fallará sí o sí?

Explico por qué uso números grandes:
Supongan que el programa calcula cuántos dibujos pueden formarse con las condiciones dadas. Siendo 8*8 cuadraditos, si mal no recuerdo el cálculo es 2^64, que en la calculadora dice que es:
18446744073709551616
ese número convertido a binario forma lo que sería el dibujo todo pintado, con uno 1 delante que sobra:
10000000000000000000000000000000000000000000000000000000000000000
se vería así si quitamos el 1:
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
son 8*8 0s.

Supongan que esa cantidad la queremos dividir entre 7, para que cada cuadro muestre la misma cantidad de esos posibles dibujos a lo largo de cierto tiempo.
El cuadro nro 1 mostrará los 1eros 1000 dibujos posibles, por decir algo, el 2ndo los siguientes, y así.

Básicamente por eso es que necesito los números grandes. A la cantidad de dibujos posible le voy restando la cantidad que va a mostrar cada cuadro, para saber qué dibujo se mostrará 1ero en cada cuadro. Eso no lo puse en el código aquí porque no creo que sea el problema.

¿Hay alguna otra cosa importante que deba decir sobre esto?

La conversión es:
Código
  1. function ConvertiraBinario (numero) {
  2. // trace("Convirtiendo a binario esto: "+numero);
  3. // Averiguar cómo es en binario:
  4. DibujoEnBinario = "";
  5. while (numero>0) {
  6. DibujoEnBinario = numero%2+DibujoEnBinario;
  7. numero = Math.floor(numero/2);
  8. }
  9. // Agregar 0s a DibujoEnBinario si hacen falta:
  10. while (DibujoEnBinario.length<Cuadraditos) {
  11. DibujoEnBinario = 0+DibujoEnBinario;
  12. }
  13. // trace("DibujoEnBinario: "+DibujoEnBinario);
  14. }


« Última modificación: 8 Julio 2025, 10:59 am por Tachikomaia » En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.584


Hackentifiko!


Ver Perfil
Re: ¿Error al convertir nùmero grande a binario?
« Respuesta #1 en: 12 Julio 2025, 12:56 pm »

Según GPT, Flash falla en guardar números demasiado grandes. Asumo que el problema es ese.

A ver, tengo una cadena que representa a un binario.

Necesito convertirlo en decimal, pero si es un número falla, así que necesito que sea una cadena.
¿Cómo convierto una cadena que representa a un binario, en una cadena que representa a un decimal? Sin convertirlo todo junto a número porque sino falla.

Luego a la cadena obtenida, que representa a un decimal, necesito dividirla por otro número, nunca tan grande. Y que el resultado sea una cadena también, porque puede ser muy grande.
¿Cómo a una cadena que representa a un decimal, la puedo dividir por un número, de modo que el resultado sea representado por una cadena? Mismo comentario.

Con eso tenemos Decimal y ResultadoDeDivision.

Por último, a Decimal necesito restarle ResultadoDeDivision varias veces, en un loop. Esto parece lo más sencillo, como hacer una resta manualmente, viendo cuales son los últimos caracteres.
¿Cómo a una cadena que representa a un decimal, le puedo restar otra que representa a otro? Mismo comentario.

O quizá sería más fácil hacer las operaciones usando las cadenas binarias, creo que no necesito los decimales.

Le preguntaré a GPT si nadie responde.


« Última modificación: 12 Julio 2025, 13:05 pm por Tachikomaia » En línea

Mr.Byte


Desconectado Desconectado

Mensajes: 341



Ver Perfil
Re: ¿Error al convertir nùmero grande a binario?
« Respuesta #2 en: 14 Julio 2025, 10:10 am »

Demasiadas preguntas, no me queda claro, no se si esto te sirve
Existen dos metodos
Decimal a binario:
Código:
var decimal:int = 42;
var binario:String = decimal.toString(2); // "101010"
Binario a decimal:
Código:
var binarioStr:String = "101010";
var decimal:int = parseInt(binarioStr, 2); // 42
En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.584


Hackentifiko!


Ver Perfil
Re: ¿Error al convertir nùmero grande a binario?
« Respuesta #3 en: 22 Julio 2025, 03:01 am »

Intento resumir y corregir algunos posibles errores que haya cometido en posts anteriores.

Se consigue el número binario que forma la L invertida, aunque es un string:
"1111111011111110111111101111111011111110111111101111111000000000"

Se intenta convertir a decimal, pero como el número resultante es tan grande, Flash falla:
9.22337203685478e+18
Según GPT, el resultado debería ser 18374686492081295424 y el número raro que pone Flash es casi la mitad de eso. Falla.

Entonces, en principio necesito un método de convertir un string que representa un número binario, en un string que represente un decimal, pero sin que dicho método use variables tipo número que sean demasiado grandes, porque sino falla.

El método que usaba, para convertir DibujoEnBinario en DibujoaMostrar, es:
Código
  1. // Convertirlo en decimal:
  2. DibujoaMostrar = 0;
  3. do {
  4. DibujoaMostrar = DibujoaMostrar+(Number(DibujoEnBinario.charat(NroDelCaracter))*Math.round(Math.pow(2, DibujoEnBinario.length-1-NroDelCaracter)));
  5. trace("Convirtiendo en decimal... "+DibujoaMostrar);
  6. NroDelCaracter++;
  7. } while (NroDelCaracter<Cuadraditos);
  8. DibujoaMostrar = Number(DibujoaMostrar);

Le expliqué a GPT y me dijo esto:
Código
  1. function binaryToDecimalString(binStr) {
  2.    var decimal = "0";
  3.    var i = 0;
  4.  
  5.    while (i < binStr.length) {
  6.        // Multiplicar el decimal actual por 2
  7.        decimal = multiplyDecimalStringByTwo(decimal);
  8.  
  9.        // Sumar el bit actual si es 1
  10.        if (binStr.charAt(i) == "1") {
  11.            decimal = addDecimalString(decimal, "1");
  12.        }
  13.  
  14.        i++;
  15.    }
  16.  
  17.    return decimal;
  18. }
  19.  
  20. // Multiplica un string decimal por 2
  21. function multiplyDecimalStringByTwo(decimal) {
  22.    var result = "";
  23.    var carry = 0;
  24.  
  25.    for (var i = decimal.length - 1; i >= 0; i--) {
  26.        var digit = Number(decimal.charAt(i)) * 2 + carry;
  27.        carry = Math.floor(digit / 10);
  28.        result = String(digit % 10) + result;
  29.    }
  30.  
  31.    if (carry > 0) {
  32.        result = String(carry) + result;
  33.    }
  34.  
  35.    return result;
  36. }
  37.  
  38. // Suma dos strings decimales
  39. function addDecimalString(a, b) {
  40.    var result = "";
  41.    var carry = 0;
  42.    var i = a.length - 1;
  43.    var j = b.length - 1;
  44.  
  45.    while (i >= 0 || j >= 0 || carry > 0) {
  46.        var digitA = i >= 0 ? Number(a.charAt(i)) : 0;
  47.        var digitB = j >= 0 ? Number(b.charAt(j)) : 0;
  48.        var sum = digitA + digitB + carry;
  49.        carry = Math.floor(sum / 10);
  50.        result = String(sum % 10) + result;
  51.        i--;
  52.        j--;
  53.    }
  54.  
  55.    return result;
  56. }

Lo voy a pensar.

Luego creo que tendría que dividir un número entre otro, pero siendo strings, y también tendría que hacer restas usando strings.
En línea

Flamer


Desconectado Desconectado

Mensajes: 1.062


crack, crack y mas crack...


Ver Perfil WWW
Re: ¿Error al convertir nùmero grande a binario?
« Respuesta #4 en: 23 Julio 2025, 17:14 pm »

hola en javascript puedes usar el comando BigInt asi

Código
  1. BigInt("0b" + binarioGigante)
  2.  

pero tiene limites no creas que todos los convierte si es demasiado grande no puede

saludos Flamer
-----Edito-----
lei mal el titulo es alreves, bueno toString(2) creo que no te sirve ya que para numeros muy grandes no puede en fin saludos
« Última modificación: 23 Julio 2025, 17:21 pm por Flamer » En línea

Mi Canal De Youtube y Blog

https://elblogdeflamer.blogspot.com

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.236



Ver Perfil
Re: ¿Error al convertir nùmero grande a binario?
« Respuesta #5 en: 24 Julio 2025, 02:00 am »

En Flash 5 el número entero más grande con el que puedes trabajar es 9007199254740992 (2^53) en en algún momento operas superando ese valor se usarán aproximaciones que obviamente perderán precisión dependiendo cuan alejados estén al límite de 2^53.

Convertir no te sirve porque igual vas a llegar a superar ese valor al intentar realizar alguna operación. Las soluciones que tienes es buscar otra forma dependiendo de como funcione tu programa o lo que quieras lograr, o trabajar todo sin convertirlo completamente, por ejemplo si intentas convertir de binario_string a decimal se te complica porque debes hacer operaciones con números enormes al depender de operaciones que involucran cada caracter

En caso de convertir de binario_string a hexadecimal lo tienes muy sencillo porque tomas de 4 en 4 bits y los conviertes a hexadecimal concatenando todo y ya está, no es necesario trabajar con todos los caracteres ni operar con todos ellos a la vez PERO el problema viene cuando dices: luego debo dividir entre otro número, ahí se rompe todo porque lo tendrás que convertir a número, lo que podrías hacer es crear una función propia para hacer la división, ya sea trabajando todo en binario, o hexadecimal, o decimal (pidiéndole a ChatGPT una función rarísima que ni se entienda XD).

Pues si por ejemplo trabajas en binario_string puro y quieres dividir lo haces como se haría con papel y lápiz a mano (como en el colegio), si el trabajo lo va hacer ChatGPT pues mejor le pides que lo trabaje todo así sin hacer conversiones innecesarias, que cree una función que divida dos binario_string

Ahora bien, con respecto a las calculadoras, la de Windows obviamente no está preparada para esas locuras XD, aunque está el viejo Microsoft Mathematics que no tendría problemas pero es una aplicación más avanzadita, para hacer tus pruebas sin errores yo te recomendaría  SpeedCrunch https://heldercorreia.bitbucket.io/speedcrunch/download.html si deseas puedes bajar la versión instalable o la portable, es muy amigable para los programadores porque es sencillísima, una forma de poner a prueba la calculadora es operando, esta calculadora puede trabajar con números de hasta 78 dígitos sin perder precisión, Excel por otro lado solo puede con 15 dígitos. Por ejemplo con SpeedCrunch:

0b1111111011111110111111101111111011111110111111101111111000000000

Mira que puse el 0b delante, eso es para especificar que estás usando un binario tal cual es 0x para los hexadecimales. Con darle un Enter te devuelve en ese número en Decimal:

18374403900871474688

Servirá como referencia, ahora hago la siguiente operación:

0b1111111011111110111111101111111011111110111111101111111000000000 * 123456789

Como resultado me muestra: 2268444905390666566675256832

Ahora el resultado de la operación anterior lo divido entre 123456789 para ver si obtengo el mismo número de la referencia:

2268444905390666566675256832 / 123456789

Devuelve: 18374403900871474688 que es exactamente igual a la muestra, es más lo puedo convertir a binario con:

bin(18374403900871474688)

dando: 0b1111111011111110111111101111111011111110111111101111111000000000 que es exactamente el binario original, es decir, no pierdes nada de precisión
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[C] e^x, si x es grande, numero negativo
Programación C/C++
edr89 9 6,147 Último mensaje 7 Junio 2013, 05:31 am
por leosansan
numero hexadecimal grande
Java
m@o_614 1 2,112 Último mensaje 21 Enero 2015, 07:14 am
por 3n31ch
Como convertir un numero a binario y usar nibbles.
ASM
Castiel 2 4,272 Último mensaje 10 Agosto 2015, 07:54 am
por Castiel
Leer un numero muy grande
Programación C/C++
mendez1415 1 2,347 Último mensaje 26 Noviembre 2016, 18:07 pm
por engel lex
Error convertir numero a letras
PHP
pompyarro 5 3,693 Último mensaje 17 Agosto 2017, 15:28 pm
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines