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位浮点数,则会产生不同的结果。
到目前为止,我对这个问题的最佳解决方案是将每个位运算的结果转换为<= 16位,使用类似于以下javascript函数的函数:
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位无符号位数操作?
3.5 << 1 == 6
或10.9 | 0 == 10
。然而,32位和16位整数的结果可能不同。@Amit提供了一种将数字转换为“16位”整数的方法,即通过修剪它来实现...但是您可能需要查看JS TypedArrays,例如Uint16Array。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays - Aurel Bílý