为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 bigInteger 没有 -1 的位长度?

为什么 bigInteger 没有 -1 的位长度?

郎朗坤 2023-09-13 17:00:54
为什么在Java中BigInteger.bitLength()打印:0-1System.out.println(BigInteger.valueOf(-1).bitLength());BigInteger 的源代码中有一条注释说:bitLength 尚未初始化public int bitLength() {        int n = bitLengthPlusOne - 1;        if (n == -1) { // bitLength not initialized yet            int[] m = mag;            int len = m.length;            if (len == 0) {                n = 0; // offset by one to initialize            }
查看完整描述

2 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

检查该方法的文档BigInteger.bitLength()

返回此 BigInteger 的最小二进制补码表示形式的位数,不包括符号位。[...]

您需要零个“值”位来表示 value 0。基本上,你“不需要做任何事情”,你就有了价值0。使用符号位,您可以在0和之间切换-1(与补码类似)。

当您拥有需要一个“值”位的值时1,因此BigInteger.bitLength()将返回1BigInteger value 1。检查以下for循环及其生成的输出:

for (int i=-16; i<=16; i++) {

    BigInteger x = BigInteger.valueOf(i);

    System.out.println(x+"| bitlength: "+x.bitLength());    

}

输出是:


-16| bitlength: 4

-15| bitlength: 4

-14| bitlength: 4

-13| bitlength: 4

-12| bitlength: 4

-11| bitlength: 4

-10| bitlength: 4

-9| bitlength: 4

-8| bitlength: 3

-7| bitlength: 3

-6| bitlength: 3

-5| bitlength: 3

-4| bitlength: 2

-3| bitlength: 2

-2| bitlength: 1

-1| bitlength: 0

0| bitlength: 0  /* 0b */

1| bitlength: 1  /* 0b1 */

2| bitlength: 2

3| bitlength: 2  /* 0b11 */

4| bitlength: 3

5| bitlength: 3

6| bitlength: 3

7| bitlength: 3  /* 0b111 */

8| bitlength: 4

9| bitlength: 4

10| bitlength: 4

11| bitlength: 4

12| bitlength: 4

13| bitlength: 4

14| bitlength: 4

15| bitlength: 4 /* 0b1111 */

16| bitlength: 5


查看完整回答
反对 回复 2023-09-13
?
临摹微笑

TA贡献1982条经验 获得超2个赞

返回最小的补码( 1),不包括符号位,在本例中符号位为 0。-1 的二进制值为0xFFFF...0b1111...,其补码(最大值)变为0,与 相加1成为二进制补码(补码 + 1)。

但是,n变量 from#bitLength不是 BigInteger 的值,而是存储的 bitLength 字段的值减 1(0这意味着尚未计算)。因此,返回aBigInteger的值与使用 -1 作为标记值的它们是巧合的。-10#bitLength

他们使用这个值来表示该字段还没有被延迟初始化,然后该bitLength字段被设置为正确的值(0)。请记住,BigInteger是不可变的,因此当计算 bitLength 时,它在该实例中永远不会改变。


查看完整回答
反对 回复 2023-09-13
  • 2 回答
  • 0 关注
  • 109 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信