JavaScript BigInt打印无符号二进制表示



使用JavaScript的BigInt时,如何打印无符号整数?

可以使用toString(2)BigInts打印为二进制表示。但是,对于负值,此函数仅在打印时附加一个-符号。

BigInt(42).toString(2)
// output => 101010
BigInt(-42).toString(2)
// output => -101010

如何打印BigInt(42)的无符号表示?我认为,对于常规的number,您可以执行(-42 >>> 0).toString(2),但似乎没有为BigInt实现无符号右移,导致错误

(BigInt(-42) >>> BigInt(0)).toString(2)
// TypeError: BigInts have no unsigned right shift, use >> instead

获得负BigInts的两个补码表示的一种简单方法是使用BigInt.asUintN(bit_width, bigint):

> BigInt.asUintN(64, -42n).toString(2)
'1111111111111111111111111111111111111111111111111111111111010110'

注意:

  • 你必须定义你想要的位数(在我的例子中是64(,没有;天然的"/自动值
  • 只给定这一串二进制数字,就无法判断这是正BigInt(值接近2n**64n(还是-42n的二补表示。因此,如果您以后想反向转换,您必须以某种方式提供这些信息(例如,通过编写代码,使其隐含地假设一个或另一个选项(
  • 与此相关的是,-42n在当前浏览器中的内部存储方式并非如此。(但这不需要担心,因为您可以随时创建此输出。(
  • 您可以通过减法获得相同的结果:((2n ** 64n) - 42n).toString(2)——同样,您可以指定希望看到的位数

BigInt有类似bitAtIndex的东西吗?

没有,因为没有关于如何表示BigInt的规范。引擎可以选择以任何方式使用位,只要生成的BigInt符合规范要求即可。


@Kyroath:

负BigInts表示为无限长二的补码

不,它们不是:当前浏览器中的实现将BigInts表示为";符号+幅度";,而不是作为二的补码。然而,这是一个不可观察的实现细节:实现可能会改变内部存储BigInt的方式,而BigInt也会有同样的行为。

你可能想说的是,任何负整数(大与否(的二元补码表示在概念上都是1位的无限流,因此在有限空间中打印或存储它总是需要定义多个字符/位,之后流就被简单地截断了。当你有一个固定宽度的类型时,这显然定义了这个截断点;对于概念上无限的BigInts,您必须自己定义它。

这里有一种将64位BigInts转换为二进制字符串的方法:

// take two's complement of a binary string
const twosComplement = (binaryString) => {
let complement = BigInt('0b' + binaryString.split('').map(e => e === "0" ? "1" : "0").join(''));
return decToBinary(complement + BigInt(1));
}
const decToBinary = (num) => {
let result = ""
const isNegative = num < 0;
if (isNegative) num = -num;
while (num > 0) {
result = (num % BigInt(2)) + result;
num /= BigInt(2);
}
if (result.length > 64) result = result.substring(result.length - 64);
result = result.padStart(64, "0");
if (isNegative) result = twosComplement(result);
return result;
}
console.log(decToBinary(BigInt(5))); // 0000000000000000000000000000000000000000000000000000000000000101
console.log(decToBinary(BigInt(-5))); // 1111111111111111111111111111111111111111111111111111111111111011

但是,此代码不进行任何验证。

最新更新