转移负BigInteger值 - Java

时间:2016-01-12 20:58:29

标签: java bit-manipulation biginteger bit-shift

我试图将7字节数组右移7位。

为此,我使用的是BigInteger的shiftright方法。但是,当向右移动负BigIntegers时,会添加1s填充或有时删除前导位。

以下是进行转换的以下代码:

byte[] vcwManD = decryptedVCW;
BigInteger bigIntD = new BigInteger(vcwManD);       // create big int array for shift
BigInteger shiftIntD= bigIntD.shiftRight(7);                // shift right 7 bits
vcwManD = shiftIntD.toByteArray();      

对于二进制的字节数组E865037A9C6424:

11101000011001010000001101111010100111000110010000100100

转换后,我得到二进制D0CA06F538C8:

110100001100101000000110111101010011100011001000

如您所见,它已向右移7位,但前导位已被剥离。

另一个问题是1填充。对于二进制的字节数组90998951A37908

10010000100110011000100101010001101000110111100100001000

以二进制生成FF213312A346F2:

11111111001000010011001100010010101000110100011011110010

这次大约7比1的开局时已经填补了。

有谁知道如何解决这个问题?

非常感谢 希夫

2 个答案:

答案 0 :(得分:2)

如果您正在进行位移,则可能使用长无符号值而不是有符号值。因此,当您创建BigInteger时,请使用此构造函数:

new BigInteger(1, vcwManD);

通过这种方式,您可以确保获得正数,并且您应该能够将其转移而不会产生任何后果。

答案 1 :(得分:1)

使用二进制补码将负数存储在内存中。这意味着如果数字为负数,则第一位将为1.当您向右移位负数时,它必须保持为负数,因此新引入的值将为1。