1 回答

TA贡献1770条经验 获得超3个赞
按位运算符将产生一个带符号的32位数字,这意味着,如果位置31处的位(从右边的最低有效位(即位0)开始计数)为1,则该数字将为负数。
为避免这种情况的发生,请使用<<或以外的其他运算符|,这两个运算符均会导致生成带符号的32位数字。例如:
(bit * 2**e) + make (more, e + 4)
强制无符号32位
移位运算符旨在将结果强制进入有符号的32位范围,至少在mdn上要求(在撰写本文时):
所有按位运算符的操作数都将转换为有符号的32位整数
实际上,这并非完全正确。该>>>运营商是一个例外。EcmaScript 2015的12.5.8.1节指出,操作数在移入0位之前已映射到32位无符号。因此,即使您将零位移位,也会看到这种效果。
您只需将其应用于最终值一次,例如在您的print函数中:
console.log((n>>>0).toString(2))
BigInt解决方案
如果您甚至需要超过32位,并且您的JavaScript引擎像某些已经支持的那样支持BigInt,则将BigInts用于按位运算符所涉及的操作数-这样,它们将不使用32位带符号数字换行(请注意后缀) :n
const make = ([ bit, ...more ], e = 0n) =>
bit === undefined
? 0n
: (bit << e) + make (more, e + 4n)
const print = n =>
console.log(n.toString(2))
// Test
for (let i=1; i<20; i++) {
print(make(Array(i).fill(15n))) // longer and longer array...
}
注意:如果在执行上述操作时遇到错误,请使用Chrome重试...
添加回答
举报