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

为什么在Java中BigInteger.bitLength()打印:0-1


System.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

            }


郎朗坤
浏览 110回答 2
2回答

茅侃侃

检查该方法的文档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: 00| bitlength: 0  /* 0b */1| bitlength: 1  /* 0b1 */2| bitlength: 23| bitlength: 2  /* 0b11 */4| bitlength: 35| bitlength: 36| bitlength: 37| bitlength: 3  /* 0b111 */8| bitlength: 49| bitlength: 410| bitlength: 411| bitlength: 412| bitlength: 413| bitlength: 414| bitlength: 415| bitlength: 4 /* 0b1111 */16| bitlength: 5

临摹微笑

返回最小的补码( 1),不包括符号位,在本例中符号位为 0。-1 的二进制值为0xFFFF.../ 0b1111...,其补码(最大值)变为0,与 相加1成为二进制补码(补码 + 1)。但是,n变量 from#bitLength不是 BigInteger 的值,而是存储的 bitLength 字段的值减 1(0这意味着尚未计算)。因此,返回aBigInteger的值与使用 -1 作为标记值的它们是巧合的。-10#bitLength他们使用这个值来表示该字段还没有被延迟初始化,然后该bitLength字段被设置为正确的值(0)。请记住,BigInteger是不可变的,因此当计算 bitLength 时,它在该实例中永远不会改变。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java