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


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  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 3,345 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.593


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.593


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: 345



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.593


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.065


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.237



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

Tachikomaia


Desconectado Desconectado

Mensajes: 1.593


Hackentifiko!


Ver Perfil
Re: ¿Error al convertir nùmero grande a binario?
« Respuesta #6 en: 12 Agosto 2025, 03:38 am »

No sé qué alternativas tengo.

Consigo en binario la cantidad de dibujos que se van a mostrar en pantalla. DIBUJOS.

Esa cantidad la necesito dividir entre el número de cuadros (o minipantallas), que está en decimal. CUADROS.
Salvo que pudiera hallar alguna regla, que luego comento.

Así que debo convertir el binario en decimal, y luego hacer la división. DIBUJOS/CUADROS.
Una alternativa, trabajar con binarios, lo veo complicado. Supongamos que convierto la cantidad de cuadros, a binario. Luego puedo hacer una división entre binarios, puedo preguntarle a GPT cómo. Pero luego a DIBUJOS tengo que irle restando eso, o sea, hacer restas en binario, y no sé realmente si voy a obtener los números que preciso.
Pero sea como sea, las divisiones van a tener que ser con strings.

Lo de la regla es que los dibujos podrían empezar de cierta forma sin que haya mucho problema. Por ejemplo si hay 4 cuadros de 3*3 cuadraditos cada uno y ponemos que empiecen así:
NNN  NNN
NBB  NBN
NBB  NBB  

NNN  NNN
NBB  NBB
NNB  NBN
Hay que ver si el cuadro inferior derecho queda todo negro (los dibujos van variando) después de que los otros cuadros mostraran todos los dibujos que deben. Si es así y se sigue cumpliendo cuando aumenta la cantidad de cuadros y cuadraditos, bueno, no sería la solución ideal, pero podría ser una solución. Como es difícil saberlo, prefiero hacer una división como se debe. Supongamos que se van a mostrar 512 dibujos. Son menos pero supongamos. Hacemos eso /4, entonces:
512   384
256   128
Me refiero a que un cuadro mostrará el dibujo 512, otro el nro 384, otro el 256, y así. Enseguida, cada uno mostrará el anterior, así:
511  383
255  127
Y así seguirán variando hasta que el inferior derecho llegue a 0 (todo negro), es decir, se muestran todos los dibujos posibles.
Cada número al convertirse a binario se convierte en una representación del dibujo, 0 es negro, 1 blanco.
Más o menos es eso, me puedo haber confundido en algo.
Si los convierto a binario ¿para qué inician como decimales? No sé, me pareció más fácil, lo pensé así, para entender mejor qué estoy haciendo. No creo que sea el problema...

En fin, que yo sepa, para empezar, tengo un binario enorme que debo convertir a decimal pero que sea string. Espero no confundirme en esto.

GPT:
Citar
Para no perder precisión en Flash 5 necesitas hacer aritmética “grande” con strings (sin usar Number para el valor completo). La idea: recorre el binario de izquierda a derecha y mantén el acumulado en decimal como un arreglo de dígitos; en cada bit haces “decimal = decimal*2 + bit”. Multiplicar por 2 y sumar 1 se hacen dígito a dígito.

Aquí tienes una función ActionScript (Flash 5) que convierte un string binario a su string decimal sin pérdida:

```actionscript
Código
  1. // Convierte un string binario (p.ej. "1101") a string decimal exacto (p.ej. "13")
  2. // No usa Number para representar el valor completo, solo dígitos individuales.
  3. function binToDecString(bin) {
  4.  // Saltar ceros líderes
  5.  var i = 0;
  6.  var n = bin.length;
  7.  while (i < n && bin.charAt(i) == "0") { i++; }
  8.  if (i >= n) return "0";
  9.  
  10.  // digits almacena el número decimal en dígitos base 10, LSB primero (digits[0] es las unidades)
  11.  var digits = [0];
  12.  
  13.  for (; i < n; i++) {
  14.    var c = bin.charAt(i);
  15.    if (c != "0" && c != "1") {
  16.      // Si hay caracteres no binarios, puedes elegir lanzar error o ignorar; aquí se ignoran.
  17.      continue;
  18.    }
  19.  
  20.    // decimal *= 2
  21.    var carry = 0;
  22.    var j;
  23.    for (j = 0; j < digits.length; j++) {
  24.      var x = digits[j] * 2 + carry; // x siempre pequeño, seguro
  25.      digits[j] = x % 10;
  26.      carry = Math.floor(x / 10);
  27.    }
  28.    while (carry > 0) {
  29.      digits[digits.length] = carry % 10;
  30.      carry = Math.floor(carry / 10);
  31.    }
  32.  
  33.    // decimal += bit (0 o 1)
  34.    if (c == "1") {
  35.      var k = 0;
  36.      var add = 1;
  37.      while (add > 0) {
  38.        if (k >= digits.length) digits[digits.length] = 0;
  39.        var y = digits[k] + add;
  40.        digits[k] = y % 10;
  41.        add = Math.floor(y / 10);
  42.        k++;
  43.      }
  44.    }
  45.  }
  46.  
  47.  // Construir string (invertir los dígitos)
  48.  var s = "";
  49.  for (var t = digits.length - 1; t >= 0; t--) {
  50.    s += digits[t];
  51.  }
  52.  return s;
  53. }
  54.  
  55. // Ejemplos:
  56. trace(binToDecString("0"));                // "0"
  57. trace(binToDecString("1"));                // "1"
  58. trace(binToDecString("10"));               // "2"
  59. trace(binToDecString("11111111"));         // "255"
  60. trace(binToDecString("10000000000000000"));// "131072"
```

Notas:
- Complejidad aproximada O(bits × dígitos_decimales). Para binarios muy largos funciona bien en Flash 5 si no son cientos de miles de bits.
- Si quieres validar estrictamente el input, en vez de “continue” cuando c != '0'/'1', lanza un error o retorna null.

Ahora tengo que intentar entender ese código... Ya había conseguido uno parecido y no pude. Le puedo ir preguntando a GPT lo que no entienda pero... si alguien pudiera hacer un código más comprensible y explicarlo con un ejemplo estaría bueno.
« Última modificación: 12 Agosto 2025, 23:33 pm por EdePC » En línea

Flamer


Desconectado Desconectado

Mensajes: 1.065


crack, crack y mas crack...


Ver Perfil WWW
Re: ¿Error al convertir nùmero grande a binario?
« Respuesta #7 en: 12 Agosto 2025, 23:08 pm »

Hola dime si te sirve este codigo esta en javascript pegalo en el bloc de notas con extensión html

Código
  1. <html>
  2. <head>
  3. <body>
  4. <center>
  5. Numero Binario:<textarea id="bin" cols="200"></textarea><br>
  6. <input type="button" value="Convertir" onclick="conver()"><br><br>
  7. Numero Decimal:<textarea id="num" cols="200"></textarea>
  8. </center>
  9. <script>
  10. function binarioGiganteADecimal(binario) {
  11.    let decimal = 0n;
  12.    for (let bit of binario) {
  13.        decimal = (decimal << 1n) + BigInt(bit); // Desplazamiento binario
  14.    }
  15.    return decimal;
  16. }
  17. function conver()
  18. {
  19.   let binario = document.getElementById("bin").value;
  20.   let decimal = binarioGiganteADecimal(binario);
  21.  
  22.   document.getElementById("num").value=decimal.toString();
  23. }
  24. </script>
  25. </body>
  26. </html>
  27.  
En línea

Mi Canal De Youtube y Blog

https://elblogdeflamer.blogspot.com

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.237



Ver Perfil
Re: ¿Error al convertir nùmero grande a binario?
« Respuesta #8 en: 13 Agosto 2025, 00:44 am »

Como dije, el convertir no te sirve porque igual vas a operar números grandes que están fuera del alcance de Flash, sí puedes convertir para intentar entender al utilizar la conocida base 10. El detalle está en las operaciones, lo que le tienes que pedir a ChatGPT es que te de una función para Operar números como string, has mencionado que necesitas División y Resta.

Estas operaciones de División y Resta podrían ser los de toda la vida, de esas que haces con lápiz y papel, directamente puedes hacer esas operaciones en cualquier Base, en tu caso Binario me parece, por ejemplo (123456789 / 123):

11110001001000000 / 1111011
 1111011          | 1111101011
--------
 11101100
  1111011
 --------
  11100010
   1111011
  --------
   11001111
    1111011
   --------
    10101000
     1111011
    --------
      10110100
       1111011
      --------
        11100100
         1111011
        --------
         11010010
          1111011
         --------
          1010111


O en decimal

123456 / 123
123    | 1003
---
   456
   369
   ---
    87


Como puedes ver el número más grande que se toma será más o menos igual al divisor, si el divisor no es tan grande puedes operar sin problemas, pero si no es el caso tendrás que usar algoritmos más complejos como ese que te mandó ChatGPT, y entenderlos es complejo, primero tendrías que ver que algoritmo está utilizando, una descripción general de los pasos al menos, y dedicarle varias horas en entenderlo

Por el vistazo rápido que le di, me parece que está haciendo la inversa de conversión de Decimal a Binario usando el algoritmo de sucesivas divisiones entre 2, además está guardando cada dígito del resultante en un array teniendo cuidado de que si dicho dígito no supere el 9, si es así lo "lleva" para sumarlo al siguiente dígito.

Por ejemplo:

Convertir 13 a binario, se hacen divisiones sucesivas entre 2, al final se recolectan desde el último cociente y los residuos en ese orden para obtener el binario

13 / 2
 1   6 / 2
     0   3 / 2
         1   1    => 1101


Para hacer lo inverso se aplica la fórmula de Dividendo = (Cociente * Divisor) + residuo, y se va haciendo lo mismo hasta utilizar todos los dígitos binarios y así obtener el primer Dividendo que será el número Decimal original

(1 * 2) + 1 = 3
 (3 * 2) + 0 = 6
 (6 * 2) + 1 = 13


Esa es la base
En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.593


Hackentifiko!


Ver Perfil
Re: ¿Error al convertir nùmero grande a binario?
« Respuesta #9 en: Hoy a las 02:01 »

Flamer:
Hice lo que dijiste, puse
1111111011111110111111101111111011111110111111101111111000000000
y el resultado fue
18374403900871474688

pero al hacerlo aquí:
https://masterplc.com/calculadora/convertir-binario-a-decimal/
fue
18374403900871475000

Y GPT dijo
18,446,744,066,181,791,744

Yo no sé :xD


Ahora en un rato voy a hablar con él sobre el código que me dió porque no lo entendí. Luego actualizo.

Edit: Hablado hasta que me quedé sin puntos.

Resumen:
qué significa Saltar ceros líderes
Citar
Ignorar los 0s que están al inicio del binario

explica esto
  while (i < n && bin.charAt(i) == "0") { i++; }
  if (i >= n) return "0";

no sé si el while ha terminado, etc. Lo veo así:
while (i < n && bin.charAt(i) == "0") {
   i++;
}
if (i >= n) return "0";
y sigue ¿es así?

Citar

cambié los i por NroDeCaracteraMirar:
(código)
¿tengo que cambiar los siguientes i o son independientes? Este:
  for (; i < n; i++) {

Citar
Representan lo mismo, debes cambiarlos también

la variable n es el largo del binario, siempre?

Citar

var para qué es, qué diferencia hay entre definir una variable con var y sin var

Citar
En ActionScript (especialmente en Flash 5/ActionScript 1), var sirve para declarar variables con alcance local a la función o al clip donde se declaran. Si no usas var, la variable se crea de forma implícita en un ámbito más global, lo que puede provocar efectos secundarios.

Diferencias clave:

- Con var:
  - Crea una variable local al ámbito actual (normalmente la función).
  - Solo existe mientras se ejecuta esa función.
  - No “ensucia” el timeline/objeto global.
  - Mejor rendimiento y menos riesgos de colisiones de nombres.

- Sin var:
  - Crea o sobrescribe una propiedad en el objeto actual (this) o en el nivel global (_root en muchos casos).
  - Persiste después de terminar la función.
  - Puede pisar variables/propiedades existentes y causar bugs difíciles de rastrear.
  - En proyectos grandes, suele generar “fugas” de estado.

Buenas prácticas en Flash 5:
- Declara siempre tus variables con var dentro de funciones.
- Evita depender de variables implícitas globales.
- Usa nombres claros (como hiciste con LargoDelBinario) y mantén la consistencia.

No sabía o me había olvidado, a veces creaba variables y luego las eliminaba, de esta forma se eliminan solas.

cómo este if no tiene el { ?
  if (NroDeCaracteraMirar >= LargoDelBinario) return "0";
normalmente se pone
si (condición) {
   efecto

Citar
En muchos lenguajes (incluido ActionScript/javascript), si el if controla una sola sentencia, puedes omitir las llaves. Estas dos formas son equivalentes:

- Forma compacta en una sola línea:
  if (condicion) return "0";

- Forma “normal” con llaves:
  if (condicion) {
    return "0";
  }

- Forma sin llaves pero en varias líneas (no recomendada por claridad):
  if (condicion)
    return "0";

Recomendación:
- Usa llaves siempre, incluso para una única sentencia, por legibilidad y para evitar errores al agregar otra línea después. Por ejemplo, este cambio accidental introduce un bug si no hay llaves:

  if (condicion)
    hacerAlgo();
    hacerOtraCosa(); // se ejecutará siempre, no está dentro del if

Con llaves, eso no pasa.

¿es posible que NroDeCaracteraMirar quede mayor que LargoDelBinario?
  // Ignorar ceros al inicio del binario:
  var NroDeCaracteraMirar = 0;
  var LargoDelBinario = bin.length;
  // Para eso mira caracteres desde la izquierda hasta que no haya caracteres o hasta que no sea 0:
  while (NroDeCaracteraMirar < LargoDelBinario && bin.charAt(NroDeCaracteraMirar) == "0") {
    NroDeCaracteraMirar++;
  }
  if (NroDeCaracteraMirar >= LargoDelBinario) {
   return "0";
  }

el incremento de NroDeCaracteraMirar ocurre sólo si es menor que LargoDelBinario, por lo que en cierto punto quedará igual y luego ya no aumentará, por lo tanto NroDeCaracteraMirar nunca será mayor que LargoDelBinario ¿correcto?

Citar
Sí.

Código más claro (aún falta aclararlo más):
Código
  1. // Convierte un string binario (p.ej. "1101") a string decimal exacto (p.ej. "13")
  2. // No usa Number para representar el valor completo, solo dígitos individuales.
  3. function binToDecString(bin) {
  4.  // Ignorar ceros al inicio del binario:
  5.  var NroDeCaracteraMirar = 0;
  6.  var LargoDelBinario = bin.length;
  7.  // Para eso mira caracteres desde la izquierda hasta que no haya caracteres o hasta que no sea 0:
  8.  while (NroDeCaracteraMirar < LargoDelBinario && bin.charAt(NroDeCaracteraMirar) == "0") {
  9.    NroDeCaracteraMirar++;
  10.  }
  11.  // Si miró todos los caracteres:
  12.  if (NroDeCaracteraMirar == LargoDelBinario) {
  13. return "0";
  14.  }
  15.  
  16.  // digits almacena el número decimal en dígitos base 10, LSB primero (digits[0] es las unidades)
  17.  var digits = [0];
  18.  
  19.  // Recorremos desde el primer '1' encontrado
  20.  for (; NroDeCaracteraMirar < LargoDelBinario; NroDeCaracteraMirar++) {
  21.    var c = bin.charAt(NroDeCaracteraMirar);
  22.    if (c != "0" && c != "1") {
  23.      continue; // o maneja error si prefieres
  24.    }
  25.  
  26.    // decimal *= 2
  27.    var carry = 0;
  28.    var j;
  29.    for (j = 0; j < digits.length; j++) {
  30.      var x = digits[j] * 2 + carry;
  31.      digits[j] = x % 10;
  32.      carry = Math.floor(x / 10);
  33.    }
  34.    while (carry > 0) {
  35.      digits[digits.length] = carry % 10;
  36.      carry = Math.floor(carry / 10);
  37.    }
  38.  
  39.    // decimal += bit
  40.    if (c == "1") {
  41.      var k = 0;
  42.      var add = 1;
  43.      while (add > 0) {
  44.        if (k >= digits.length) digits[digits.length] = 0;
  45.        var y = digits[k] + add;
  46.        digits[k] = y % 10;
  47.        add = Math.floor(y / 10);
  48.        k++;
  49.      }
  50.    }
  51.  }
  52.  
  53.  // Construir string (invertir los dígitos)
  54.  var s = "";
  55.  for (var t = digits.length - 1; t >= 0; t--) {
  56.    s += digits[t];
  57.  }
  58.  return s;
  59. }

EdePC te respondo otro día porque por hoy este tema me cansó/aburrió, pero a simple vista, sí, voy a tener que poner que el programa opere así, pero eso es un problema a resolver más adelante.
« Última modificación: Hoy a las 03:04 por Tachikomaia » 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,243 Último mensaje 7 Junio 2013, 05:31 am
por leosansan
numero hexadecimal grande
Java
m@o_614 1 2,189 Último mensaje 21 Enero 2015, 07:14 am
por 3n31ch
Como convertir un numero a binario y usar nibbles.
ASM
Castiel 2 4,332 Último mensaje 10 Agosto 2015, 07:54 am
por Castiel
Leer un numero muy grande
Programación C/C++
mendez1415 1 2,429 Último mensaje 26 Noviembre 2016, 18:07 pm
por engel lex
Error convertir numero a letras
PHP
pompyarro 5 3,776 Ú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