在查看此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;
}
我的问题是0x40000000
和0x7fffffff
的重要性。我有点理解按位移位的想法,但我对这两个数字的重要性感到迷茫。
答案 0 :(得分:1)
0x7fffffff
代表1
的前31位(从RHS读取)。所以0x7fffffff+1
是32位1
。
0x40000000
代表1000000000000000000000000000000
,其中1
是第31位(读取RTL)。
这与操作32位数据块有关,我假设。
答案 1 :(得分:1)
0x7fffffff
以二进制形式显示0
,后跟31 1
s。向其中添加一个0x80000000
,1
后跟31 0
。我不知道为什么不存在直接常数。 %
0x80000000
将切断第32位和所有更高位。
0x40000000
是二进制,0
,1
,然后是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