我正在一个共享的代码库上编写代码,并且对于“无按位运算”有一条规则。但是,我正在使用一个简短的实用函数将二进制字符串转换为unsigned int 32,big-endian。它运作良好:

// converts a four-character string into a big endian 32-bit unsigned integer
stringAsUInt32BE(binString) {
  return (binString.charCodeAt(0) << 24) + (binString.charCodeAt(1) << 16) +
    (binString.charCodeAt(2) << 8) + binString.charCodeAt(3);
};

没有按位操作怎么办?谢谢!

最佳答案

您可以将<< x替换为* Math.pow(2, x)

这两个语句之间的主要区别是输入非常大或为负的x的行为,例如按位运算符将其操作数转换为两个补数,而其他算术运算符则不。

// converts a four-character string into a big endian 32-bit unsigned integer
function stringAsUInt32BE(binString) {
  return binString.charCodeAt(0) * 16777216 + binString.charCodeAt(1) * 65536 + binString.charCodeAt(2) * 256 + binString.charCodeAt(3);
}

console.log(stringAsUInt32BE('\xFF\xFF\xFF\xFF')); // 4294967295
console.log(stringAsUInt32BE('\x00\x00\x00\x00')); // 0


注意stringAsUInt32BE('\xFF\xFF\xFF\xFF')的行为:您的原始函数将返回-1,我认为这是一个错误。这是因为'\xFF'.charCodeAt(0) << 24 === 255 << 24超出了两个补码的最大范围Math.pow(2, 32-1)-1,因此溢出到-16777216。此处给出的功能不会遇到该转换问题。

09-27 03:09