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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web (Moderador: #!drvy)
| | |-+  Alguien me ayuda a interpretar dos lineas de javascript?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Alguien me ayuda a interpretar dos lineas de javascript?  (Leído 3,233 veces)
WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.606


Sin conocimiento no hay espíritu


Ver Perfil WWW
Alguien me ayuda a interpretar dos lineas de javascript?
« en: 21 Marzo 2016, 03:51 am »

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:

Código:
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.


En línea

El_Andaluz


Desconectado Desconectado

Mensajes: 4.205



Ver Perfil
Re: Alguien me ayuda a interpretar dos lineas de javascript?
« Respuesta #1 en: 21 Marzo 2016, 05:14 am »

Mira en esta pagina a ver si te sirve:
https://msdn.microsoft.com/es-es/library/t7f48wx9(v=vs.94).aspx


« Última modificación: 21 Marzo 2016, 05:29 am por El_Andaluz » En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: Alguien me ayuda a interpretar dos lineas de javascript?
« Respuesta #2 en: 21 Marzo 2016, 05:45 am »

>> 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
  1. x[n] |= b

Es lo mismo que escribir:

Código
  1. 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
  1. len >> 5

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

Código
  1. Math.floor(len / 32);

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

0x80 en binario es:
Código
  1. 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.
En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.606


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: Alguien me ayuda a interpretar dos lineas de javascript?
« Respuesta #3 en: 22 Marzo 2016, 13:52 pm »

Muchas gracias :)

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

Se podrían traducir en esto?
Código:
// 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; // =
}
En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: Alguien me ayuda a interpretar dos lineas de javascript?
« Respuesta #4 en: 22 Marzo 2016, 14:08 pm »

Muchas gracias :)

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

Se podrían traducir en esto?
Código:
// 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; // =
}

Código:
// 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:

Código:
0x80:
10000000

0x20:
00100000

0x80 | 0x20 = 0xA0:
10100000

0x80 tampoco es un caracter, es un número.
En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.606


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: Alguien me ayuda a interpretar dos lineas de javascript?
« Respuesta #5 en: 24 Marzo 2016, 01:53 am »

Muchas gracias :) ya me queda mucho mas claro.

Saludos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines