理解javascript二进制解析器

时间:2011-11-21 05:30:01

标签: javascript binary

在查看此question时,我试图弄清楚这个功能

_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 implementation

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

我的问题是0x400000000x7fffffff的重要性。我有点理解按位移位的想法,但我对这两个数字的重要性感到迷茫。

3 个答案:

答案 0 :(得分:1)

0x7fffffff代表1的前31位(从RHS读取)。所以0x7fffffff+1是32位1

0x40000000代表1000000000000000000000000000000,其中1是第31位(读取RTL)。

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

答案 1 :(得分:1)

0x7fffffff以二进制形式显示0,后跟31 1 s。向其中添加一个0x800000001后跟31 0。我不知道为什么不存在直接常数。 % 0x80000000将切断第32位和所有更高位。

0x40000000是二进制,01,然后是30 0& 0x40000000并检查0x40000000的相等性,检查是否设置了第31位(此时从右侧算起)。

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

答案 2 :(得分:0)

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

0x40000000是1 GB 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