我正在一个共享的代码库上编写代码,并且对于“无按位运算”有一条规则。但是,我正在使用一个简短的实用函数将二进制字符串转换为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
。此处给出的功能不会遇到该转换问题。