2 回答
TA贡献1842条经验 获得超21个赞
检查该方法的文档BigInteger.bitLength()
:
返回此 BigInteger 的最小二进制补码表示形式的位数,不包括符号位。[...]
您需要零个“值”位来表示 value 0
。基本上,你“不需要做任何事情”,你就有了价值0
。使用符号位,您可以在0
和之间切换-1
(与补码类似)。
当您拥有需要一个“值”位的值时1
,因此BigInteger.bitLength()
将返回1
BigInteger 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
TA贡献1982条经验 获得超2个赞
返回最小的补码( 1
),不包括符号位,在本例中符号位为 0。-1 的二进制值为0xFFFF...
/ 0b1111...
,其补码(最大值)变为0
,与 相加1
成为二进制补码(补码 + 1)。
但是,n
变量 from#bitLength
不是 BigInteger 的值,而是存储的 bitLength 字段的值减 1(0
这意味着尚未计算)。因此,返回aBigInteger
的值与使用 -1 作为标记值的它们是巧合的。-1
0
#bitLength
他们使用这个值来表示该字段还没有被延迟初始化,然后该bitLength
字段被设置为正确的值(0)。请记住,BigInteger
是不可变的,因此当计算 bitLength 时,它在该实例中永远不会改变。
添加回答
举报