Понимание двоичного анализатора JavaScript - PullRequest
0 голосов
/ 21 ноября 2011

Рассматривая этот вопрос Я пытался выяснить эту функцию

_shl: function (a, b){
  for (++b; --b; a = ((a %= 0x7fffffff + 1) & 0x40000000) == 0x40000000 ? a * 2 : (a - 0x40000000) * 2 + 0x7fffffff + 1);
  return a;
}

Я выяснил синтаксис javascript, а также нашел несжатую версию функции, используемой в реализации md5 javascript

function shl1(a) {
  a=a%(0x7fffffff+1);
  if (a&0x40000000==0x40000000)
  {
    a-=0x40000000;  
    a*=2;
    a+=(0x7fffffff+1);
  } else
    a*=2;
  return a;
}

function shl(a,b) {
  a=integer(a);
  b=integer(b);
  for (var i=0;i<b;i++) a=shl1(a);
  return a;
}

У меня вопрос, что значимо в 0x40000000 и 0x7fffffff. Я немного понимаю идею побитового сдвига, но теряюсь в важности этих двух чисел.

Ответы [ 3 ]

1 голос
/ 21 ноября 2011

0x7fffffff - в двоичном виде 0, за которым следует 31 1 с. Добавление одного к нему дает 0x80000000, 1, а затем 31 0 с. Я не знаю, почему прямой константы нет. % ing by 0x80000000 обрезает 32-й и все старшие биты.

0x40000000 в двоичном виде: 0, 1, а затем 30 0 с. & с помощью 0x40000000 и проверкой на равенство 0x40000000 проверяет, установлен ли этот 31-й бит (считая от правого на этот раз).

Насколько я могу судить, раздел (a - 0x40000000) * 2 + 0x7fffffff + 1) должен совпадать с a. Не уверен, зачем нужен расширенный код.

1 голос
/ 21 ноября 2011

0x7fffffff представляет первые 31 бит 1 (чтение из RHS). Так что 0x7fffffff+1 - это 32 бита 1.

0x40000000 представляет 1000000000000000000000000000000, где 1 - 31-й бит (чтение RTL).

Полагаю, это связано с манипулированием 32-битным блоком данных.

0 голосов
/ 21 ноября 2011

Функции, которые вы перечислили, являются хеш-генераторами. Они генерируют уникальный номер на основе полученного значения.
В Javascript '0x' - это префикс шестнадцатеричного числа.

0x40000000 - 1 ГБ.
0x7fffffff = 2 ^ 31 - 1 = 2 147 483 647
Число 2 147 483 647 также является максимальным значением для 32-разрядного целого числа со знаком в вычислениях.

http://en.wikipedia.org/wiki/2147483647
http://en.wikipedia.org/wiki/Gigabyte

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...