javascript - Javascript 中的 16 位二进制算术

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

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

我需要使用 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 位 float ,则会产生不同的结果。

到目前为止,我对该问题的最佳解决方案是使用如下函数 (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 位无符号按位运算?

最佳答案

您可以使用 bitwise AND .

它对 32 位整数进行操作,但您可以使用 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));
}

关于javascript - Javascript 中的 16 位二进制算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37773785/

相关文章:

c++ - 我在哪里可以创建没有管理员权限/特权的目录?

java - 左移无符号字节,更好的方法?

c++ - 将 long 转换为 int 与使用按位 AND 以获得 4 个最低有效字节之间有什么区别?

javascript - onmousemove,传递给事件的内容 - javascript

javascript - 自定义 Angular Directive(指令)以在间隔中添加/删除类

javascript - Angularjs 维护用户状态和部分模板

c - 在 C : check if file is executable 中实现 Unix shell

c - Mac OS X 上由 pclose() 引起的 Valgrind 错误

javascript - 如何在多个变量中存储多个编码值

java - Java 中的位运算 : Test if in "1010101111011" a bit is set?