2017-03-14 41 views
1

考慮下面的代碼:Java的BigInteger的如何登錄幅度作品

int i = 1; 
System.out.println("1 binary: " + Long.toBinaryString(i)); 
long ri = Long.reverse(i); 
System.out.println("1 reverse bit decimal: " + ri); 
System.out.println("1 reverse bit binary: "+ Long.toBinaryString(ri)); 
BigInteger bil = new BigInteger(1, Longs.toByteArray(ri)); 
System.out.println("1 Sign-Magnitude BigInteger toString: " + bil.toString()); 

輸出是:

1 binary: 1 
1 reverse bit decimal: -9223372036854775808 
1 reverse bit binary: 1000000000000000000000000000000000000000000000000000000000000000 
1 Sign-Magnitude BigInteger toString: 9223372036854775808 

誰能幫助解釋爲什麼「1符號 - 幅度的BigInteger的toString的價值: 「是9223372036854775808(2^63)?

+0

Plase讀了大約一補,補 - 這Java使用簡單的類型,如int和長 - 和登錄幅度,這BigInteger的使用。你似乎很迷惑*回覆*,*反轉*和*否定*。在二進制補碼中,否定意味着反轉並添加一個。在補碼中,反轉和否定是相同的。在符號幅度中,否定意味着翻轉符號位。但是這些*都沒有恢復*(即將最低位變成最高位等) –

回答

1

要獲得某個值的符號大小,只需將其絕對值作爲幅度並記住單獨位(或字節)中的符號。

,比方說,722的符號 - 幅度表示很簡單:

sign = 0 
magnitude = 722 

-722符號幅度很簡單:

sign = 1 
magnitude = 722 

這也是什麼BigInteger用途。

您的代碼反轉的值,這意味着,比方說,8位值00000001(1)改變爲10000000(128或2^7)。這與反轉不同,後者例如變成00000001(1)變成11111110(254)。那是的補充呢。一般使用的二進制補碼00000001(1)否定爲11111111(255,即256-1)。你應該閱讀約two's complement,這需要一些理解。然而,符號幅度很容易理解(但並不總是非常實際 - 對於有符號和無符號等,加法,減法是不同的 - 這就是爲什麼大多數處理器使用2的補碼)

所以再次:符號 - 幅度是這樣的:

sign = (n < 0) 
magnitude = abs(n)