2 回答

TA貢獻1842條經驗 獲得超22個贊
檢查該方法的文檔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 時,它在該實例中永遠不會改變。
添加回答
舉報