Bueno hablé hasta no tener puntos. Probablemente no tenga mucho sentido copiar la conversación pero acá va un resumen:
qué significa Saltar ceros líderes
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í?
Sí
cambié los i por NroDeCaracteraMirar:
(código)
¿tengo que cambiar los siguientes i o son independientes? Este:
for (; i < n; i++) {
Representan lo mismo, debes cambiarlos también
la variable n es el largo del binario, siempre?
sí
var para qué es, qué diferencia hay entre definir una variable con var y sin var
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
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?
Sí.
Código más claro (aún falta aclararlo más):
// Convierte un string binario (p.ej. "1101") a string decimal exacto (p.ej. "13")
// No usa Number para representar el valor completo, solo dígitos individuales.
function binToDecString(bin) {
// 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++;
}
// Si miró todos los caracteres:
if (NroDeCaracteraMirar == LargoDelBinario) {
return "0";
}
// digits almacena el número decimal en dígitos base 10, LSB primero (digits[0] es las unidades)
var digits = [0];
// Recorremos desde el primer '1' encontrado
for (; NroDeCaracteraMirar < LargoDelBinario; NroDeCaracteraMirar++) {
var c = bin.charAt(NroDeCaracteraMirar);
if (c != "0" && c != "1") {
continue; // o maneja error si prefieres
}
// decimal *= 2
var carry = 0;
var j;
for (j = 0; j < digits.length; j++) {
var x = digits[j] * 2 + carry;
digits[j] = x % 10;
carry = Math.floor(x / 10);
}
while (carry > 0) {
digits[digits.length] = carry % 10;
carry = Math.floor(carry / 10);
}
// decimal += bit
if (c == "1") {
var k = 0;
var add = 1;
while (add > 0) {
if (k >= digits.length) digits[digits.length] = 0;
var y = digits[k] + add;
digits[k] = y % 10;
add = Math.floor(y / 10);
k++;
}
}
}
// Construir string (invertir los dígitos)
var s = "";
for (var t = digits.length - 1; t >= 0; t--) {
s += digits[t];
}
return s;
}