C语言 Javascript中的16位二进制算术



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

使用 Javascript,我需要实现一个哈希算法,该算法旨在用 16 位无符号整数编写C

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

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)将每个按位运算的结果转换为<= 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));
}

但我不是 100% 相信这总是会产生正确的结果。

有没有标准方法可以模拟 Javascript 中数字值的 16 位无符号按位运算?

您可以使用按位 AND。

它对 32 位整数进行操作,但您可以使用 0xffff "and"。

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

我怀疑@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];
}

最新更新