2016-08-11 85 views
2

有人可以解釋BigInteger的以下兩個初始化之間的區別。來自字符串和字節數組的BigInteger值的差異

輸入:

BigInteger bi1 = new BigInteger("EF", 16); 
byte[] ba = new byte[] {(byte)0xEF}; 
BigInteger bi2 = new BigInteger(ba); 
Log.d("BIGINTEGER", "Big Integer1 = " + bi1.toString(16)); 
Log.d("BIGINTEGER", "Big Integer2 = " + bi2.toString(16)); 

輸出:

Big Integer1 = ef 
Big Integer2 = -11 

我怎麼能初始化一個BigInteger從字節數組值 「EF」?

回答

5

BigInteger docs

構造方法

的BigInteger(字節[] VAL)

翻譯一個字節數組,其中包含二進制補碼二進制將BigInteger的代表 代表整合到BigInteger中。

補碼是真正的原因。

讓我們看看如何...

二進制= 11101111 (Byte)0xef現在轉換回詮釋,你會得到-17(基數爲10)或-11(基數爲16)。

現在看看

byte[] ba = new byte[] {0, (byte)0xEF}; 

這具有的(Byte)0xef而是由0前綴這意味着該陣列具有00000000 11101111,這轉換時給出正確的結果。

爲什麼前面的情況有所不同?

退房2的補規則 - SO Answer,強制Wikipedia link

思考這個

0xEF在小數字節= 239

範圍從-127到128

的另一種方式

我們有溢出。

239 - 128 = 111

現在算上這111回(數字數據類型有這個圓形的行爲,這也是因爲2的補碼錶示)。

例如:129.toByte = -127

(129 - 128 = 1,從後面的第一值計數= -127)

快捷方式從背面if x>128 && x<256 then x.toByte = (x - 128) - 128

這裏X = 239,從而X計數。 toByte = -17

0

將前導零到byte[]

byte[] ba = new byte[] {0, (byte)0xEF}; 

Ideone demo

+0

謝謝,工作。你能向我解釋這是怎麼回事嗎? – Harish

0

公共的BigInteger(字節[] VAL)

平移含有一個字節數組二進制補碼將BigInteger的二進制表示形式轉換爲BigInteger。輸入數組假定位於big-endian字節順序:最高有效字節位於第零個元素中。

公共的BigInteger(字符串纈氨酸, INT基數)

將BigInteger的String表示指定基數轉換爲BigInteger。 [...]

來源:Oracle Java 7個的文件

從一個字節組你的初始化不會像預期的那樣,因爲0xEF澆鑄爲字節組返回{1,1,1,0, 1,1,1,1}。

根據上述如下完成的規格製造爲一個整數:

1*2^0 + 1*2^1 + 1*2^2 + 1*2^3 + 0*2^4 + 1*2^5 + 1*2^6 - 1*2^7 = -17 = -0x11 

的二進制補碼,稱讚導致最高字節中扣除,而不是被加入。所以加入一個0到beginningthe字節數組也許應該解決這個問題:

byte[] ba = new byte[] {0, (byte)0xEF}; 
0

你需要一個零添加到byte[]數組:

byte[] myByteArray = new byte[] {0, (byte)0xEF}; 
BigInteger bi2 = new BigInteger(ba); 
Log.d("BIGINTEGER", "Big Integer1 = " + bi1.toString(16)); 
Log.d("BIGINTEGER", "Big Integer2 = " + bi2.toString(16)); 

爲什麼呢?

很好的原因是有關語言規範:

十進制文字有沒有被十六進制共享特定的屬性,即十進制文字都是積極 [JLS 3.10.1]

要寫出負的十進制常量,需要結合使用一元否定運算符(-)和十進制文字。

通過這種方式,您可以使用十進制形式編寫任何int或long值,無論是正數 還是負數,負數小數常數都可以通過減號來清楚地標識。

對於十六進制或八進制文字並非如此。 他們可以承擔正面和負面的價值。如果設置了高位,則十六進制和八進制文字爲 。

所以話說回來,0xFE的實際上是一個負數...