Alguien me ayuda a interpretar dos lineas de javascript?

Iniciado por WHK, 21 Marzo 2016, 03:51 AM

0 Miembros y 1 Visitante están viendo este tema.

WHK

Hola, estoy estudiando este algoritmo para un trabajo que estoy haciendo pero me cuesta encontrar información ya que google no te ayuda mucho cuando buscas sintaxis, operadores y comparadores en javascript, por lo general no encuentro cosas que me ayuden a interpretar que es esto:


var x = buffer;
var len = n;

x[len >> 5] |= 0x80 << (len % 32)
x[(((len + 64) >>> 9) << 4) + 14] = len


Lo que si se es que x[n] se refiere al numero de columna de un array de un string, "<<<" es una corrida de bytes, pero "<<" ?, a demás estoy buscando información sobre "|=", supongo que significa "or equal".

Lo que puedo intentar comprender de la primera linea es que si no existe el byte con un numero determinado (longitud?) entonces equivaldrá a la corrida de bytes de \x80, en caso contrario se mantiene como está. Esto es correcto?, lo que también se es que (len % 30), el resultado va de 30 en 30, por ejemplo 62 % 30 es 2, pero del resto no se muy bien.

El_Andaluz

#1

MinusFour

>> mueve bits a la derecha, << mueve bits a la izquierda. Los dos trabajan con enteros de 32 bits, los valores son convertidos a enteros de 32 bits previamente.

Hay poca diferencia entre >> y >>>, ambos mueven los bits a la derecha pero >> agrega valores iguales al último bit a la izquierda y >>> siempre agrega 0s a la izquierda. El operador >>> también es el único operador que trabaja con enteros de 32 bits sin signo. La conversión del operando es diferente también. >> basicamente preserva el signo del número, mientras que >>> no. Fuera de eso (y la conversión de enteros mayores a 2^31 - 1) realizan la misma operación.

Código (javascript) [Seleccionar]

x[n] |= b


Es lo mismo que escribir:

Código (javascript) [Seleccionar]

x[n] = x[n] | b


El operador | realiza la operación OR bit a bit entre los dos operandos.

Respecto a tu programa, es mejor si lo descompones en partes:

Código (javascript) [Seleccionar]

len >> 5


Mueve len 5 bytes a la derecha. Es lo mismo que hacer:

Código (javascript) [Seleccionar]

Math.floor(len / 32);


Es decir, te regresa el cociente de la operación.

0x80 en binario es:
Código (javascript) [Seleccionar]

10000000


Len % 32 te regresa el residuo de la operación anterior (len / 32). El operador << mueve los bits a la izquierda. El resultado de esta operación siempre es 0 si el residuo es 25 o mayor, la operación OR que se realiza posteriormente señala una posible suma el resultado anterior: 1 ^ (7 + residuo) con el valor que se encuentra en el indice obtenido de len >> 5. Con la excepción que cuando el residuo es 25 o mayor se suma 0. También es importante mencionar que el valor regresado por << regresa un entero de 32 bits con signo, por lo que  1 << 31 (cuando el residuo es 24) regresa el valor negativo más grande que puede representar un entero de 32 bits (-2147483648). Esto es lo que hace tu tercer enunciado.

WHK

Muchas gracias :)

Entonces la primera linea:
x[len >> 5] |= 0x80 << (len % 32)

Se podrían traducir en esto?
// x[byte_exist] |= 0x80 << (len % 32)
byte_exist = (len >> 5);
if(typeof(x[byte_exist]) == 'undefined') // x[byte_exist] |
{
const_to_shift_left = '\x80'; // €
resto = (len - (32 * Math.floor(len / 32))) // (len % 32);
x[byte_exist] = const_to_shift_left << resto; // =
}

MinusFour

Cita de: WHK en 22 Marzo 2016, 13:52 PM
Muchas gracias :)

Entonces la primera linea:
x[len >> 5] |= 0x80 << (len % 32)

Se podrían traducir en esto?
// x[byte_exist] |= 0x80 << (len % 32)
byte_exist = (len >> 5);
if(typeof(x[byte_exist]) == 'undefined') // x[byte_exist] |
{
const_to_shift_left = '\x80'; // €
resto = (len - (32 * Math.floor(len / 32))) // (len % 32);
x[byte_exist] = const_to_shift_left << resto; // =
}


// x[byte_exist] |= 0x80 << (len % 32)
byte_exist = (len >> 5);
const_to_shift_left = 0x80;
resto = (len - (32 * Math.floor(len / 32))) // (len % 32);
x[byte_exist] |= const_to_shift_left << resto; // =


El operardor |= no es un operador para checar si es undefined o no. El operador | es usado para hacer operaciones OR bit a bit:


0x80:
10000000

0x20:
00100000

0x80 | 0x20 = 0xA0:
10100000


0x80 tampoco es un caracter, es un número.

WHK

Muchas gracias :) ya me queda mucho mas claro.

Saludos.