理解javascript二进制解析器

理解javascript二进制解析器,javascript,binary,Javascript,Binary,在看这个的过程中,我试图弄明白这个函数 _shl: function (a, b){ for (++b; --b; a = ((a %= 0x7fffffff + 1) & 0x40000000) == 0x40000000 ? a * 2 : (a - 0x40000000) * 2 + 0x7fffffff + 1); return a; } 我找到了javascript语法,还找到了md5中使用的函数的未压缩版本 功能shl1(a){ a=a%(0x7FFFFF+1);

在看这个的过程中,我试图弄明白这个函数

_shl: function (a, b){
  for (++b; --b; a = ((a %= 0x7fffffff + 1) & 0x40000000) == 0x40000000 ? a * 2 : (a - 0x40000000) * 2 + 0x7fffffff + 1);
  return a;
}
我找到了javascript语法,还找到了md5中使用的函数的未压缩版本

功能shl1(a){
a=a%(0x7FFFFF+1);
如果(a&0x40000000==0x40000000)
{
a-=0x40000000;
a*=2;
a+=(0x7fffffff+1);
}否则
a*=2;
返回a;
}
功能shl(a,b){
a=整数(a);
b=整数(b);

for(var i=0;i
0x7fffffff
表示
1
(从RHS读取)的前31位。因此
0x7fffffff+1
是32位
1

0x40000000
表示
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000


我假设这与操作32位数据块有关。

您列出的函数是散列生成器。它们根据接收到的值生成唯一的数字。
在Javascript中,“0x”是十六进制数的前缀。

0x40000000是1 GB。
0x7fffffff=2^31-1=2147483647
数字2147483647也是计算中32位有符号整数的最大值



二进制形式的
0x7fffffff
是一个
0
后接31个
1
s。加上一个
0x8000000
,一个
1
后接31个
0
s。我不知道为什么直接常数不存在。
%
0x8000000
进行运算将切断第32位和所有高位

0x40000000
在二进制中是一个
0
,一个
1
,然后是30个
0
&
0x40000000
匹配并检查是否等于
0x40000000
检查是否设置了第31位(这次从右侧开始计数)

据我所知,
(a-0x40000000)*2+0x7fffffff+1)
部分应该与
a
相同。不确定为什么需要扩展代码

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;
}