2 回答

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超21個(gè)贊
檢查該方法的文檔BigInteger.bitLength()
:
返回此 BigInteger 的最小二進(jìn)制補(bǔ)碼表示形式的位數(shù),不包括符號(hào)位。[...]
您需要零個(gè)“值”位來(lái)表示 value?0
?;旧?,你“不需要做任何事情”,你就有了價(jià)值0
。使用符號(hào)位,您可以在0
和之間切換-1
(與補(bǔ)碼類似)。
當(dāng)您擁有需要一個(gè)“值”位的值時(shí)1
,因此BigInteger.bitLength()
將返回1
BigInteger value?1
。檢查以下for
循環(huán)及其生成的輸出:
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貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
返回最小的補(bǔ)碼(?1
),不包括符號(hào)位,在本例中符號(hào)位為 0。-1 的二進(jìn)制值為0xFFFF...
/?0b1111...
,其補(bǔ)碼(最大值)變?yōu)?code>0,與 相加1
成為二進(jìn)制補(bǔ)碼(補(bǔ)碼 + 1)。
但是,n
變量 from#bitLength
不是 BigInteger 的值,而是存儲(chǔ)的 bitLength 字段的值減 1(0
這意味著尚未計(jì)算)。因此,返回aBigInteger
的值與使用 -1 作為標(biāo)記值的它們是巧合的。-1
0
#bitLength
他們使用這個(gè)值來(lái)表示該字段還沒(méi)有被延遲初始化,然后該bitLength
字段被設(shè)置為正確的值(0)。請(qǐng)記住,BigInteger
是不可變的,因此當(dāng)計(jì)算 bitLength 時(shí),它在該實(shí)例中永遠(yuǎn)不會(huì)改變。
添加回答
舉報(bào)