2016-08-12 68 views
-1

BigInteger中是否有獲取2的補碼值的方法? 對於例如:如果有一個BigInteger與負值如何獲得任意長度的BigInteger的2的補碼值

BigInteger a = new BigInteger("-173B8EC504479C3E95DEB0460411962F9EF2ECE0D3AACD749BE39E1006FC87B8", 16); 

話,我想獲得2的補在一個BigInteger形式

BigInteger b = E8C4713AFBB863C16A214FB9FBEE69D0610D131F2C55328B641D61EFF9037848 

我可以從0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF減去第一的BigInteger拿到第二個BigInteger,但有沒有一種通用的方法來計算任何長度的BigInteger?

+1

對不起,我沒有答案,但你究竟使用這個? – Michael

+0

我們在Android和iOS上遵循協議。在iOS中,BIGNUM產生+ ve數字,但在Android中,BigInteger顯示-ve數(2的補碼)。我們需要匹配兩個值來進行計算。 – Harish

+0

爲什麼你使用BigInteger呢?我認爲這更多是協議解析器的問題。我建議你編輯你的問題,並添加關於你收到什麼數據的信息和代碼,以及你如何解析它,以及你以後做了什麼。 – Robert

回答

2

使這個值的二進制補碼,你將不得不操縱的內容。這當然是不可能的,所以你第一次得到的內容出來,操縱它們,然後讓他們到一個新的BigInteger

public static BigInteger twosComplement(BigInteger original) 
{ 
    // for negative BigInteger, top byte is negative 
    byte[] contents = original.toByteArray(); 

    // prepend byte of opposite sign 
    byte[] result = new byte[contents.length + 1]; 
    System.arraycopy(contents, 0, result, 1, contents.length); 
    result[0] = (contents[0] < 0) ? 0 : (byte)-1; 

    // this will be two's complement 
    return new BigInteger(result); 
} 

public static void main(String[] args) 
{ 
    BigInteger a = new BigInteger("-173B8EC504479C3E95DEB0460411962F9EF2ECE0D3AACD749BE39E1006FC87B8", 16); 
    BigInteger b = twosComplement(a); 

    System.out.println(a.toString(16).toUpperCase()); 
    System.out.println(b.toString(16).toUpperCase()); 

    // for comparison, from question: 
    System.out.println("E8C4713AFBB863C16A214FB9FBEE69D0610D131F2C55328B641D61EFF9037848"); 
} 

輸出:

-173B8EC504479C3E95DEB0460411962F9EF2ECE0D3AACD749BE39E1006FC87B8 
E8C4713AFBB863C16A214FB9FBEE69D0610D131F2C55328B641C61EFF9037848 
E8C4713AFBB863C16A214FB9FBEE69D0610D131F2C55328B641D61EFF9037848 

而這個新BigInteger是真正的補,而不僅僅是對比特的重新解釋。

+0

如果你不想修改正的BigInteger,那麼如果BigInteger已經爲正值,那麼要麼不調用'twosComplement()',要麼當'original'爲正值時讓它返回。以上將轉換成+ ve,反之亦然。 –

+0

謝謝魯迪,我已經包含了以下條件--ve BigIntegers,它工作正常。 if(b.compareTo(BigInteger.ZERO)<0){ b = twosComplement(b); } – Harish

+0

@Harish:YAY!