Javascript

时间:2016-06-12 11:39:25

标签: javascript c bit-manipulation bitwise-operators bit-shift

Javascript只有一种数字类型:64位浮点数。

使用Javascript,我需要实现一个散列算法,该算法设计用C写成16位无符号整数。

主要操作是这样的(伪代码):

uint16 n = 0;
string s = "abcd1234";

for (int i = 0; i < s.length; i += 1) {
    n ^= (n << 2) + (n >> 3) + s[i];
}

return n;

当然,这会在使用uint16值时产生一个结果,如果n是64位浮点,则产生不同的结果。

到目前为止,我对该问题的最佳解决方案是使用类似这样的函数(javascript)将每个按位运算的结果转换为&lt; = 16位:

function uint16 (n) {
    return parseInt(n.toString(2).slice(-16), 2);
}

执行类似这样的操作(javascript):

for (var i = 0; i < s.length; i +=1 ) {
    n ^= uint16(uint16(n << 2) + uint16(n >>> 3) + s.charCodeAt(i));
}

但我并非百分之百地确信这将始终产生正确的结果。

是否有任何标准方法可以在Javascript中对数字值模拟16位无符号按位运算?

2 个答案:

答案 0 :(得分:2)

您可以使用bitwise AND

它以32位整数运行,但你可以只是&#34;和&#34;与0xffff。

function uint16 (n) {
  return n & 0xFFFF;
}

此外,位移操作(<<>>>)也可以在32位整数上运行,因此您只需要在赋值之前调用uint16函数:

for (var i = 0; i < s.length; i +=1 ) {
  n ^= uint16((n << 2) + (n >>> 3) + s.charCodeAt(i));
}

答案 1 :(得分:0)

我怀疑@Amit的版本执行速度会更快,但这是我成功的解决方法:

//create a typed container, we'll work only in the first index.
const idx = 0;
const n = new Uint16Array(1);

for (int i = 0; i < s.length; i += 1) {
    n[idx] ^= (n[idx] << 2) + (n[idx] >> 3) + s[i];
}