2016-08-12 40 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!