移动负 BigInteger 值 - Java

Shifting negative BigInteger value - Java

我正在尝试将一个 7 字节数组向右移动 7 位。

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

下面是执行移位的代码:

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。

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

非常感谢 希夫

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

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

new BigInteger(1, vcwManD);

这样你就可以保证得到一个正数并且你应该能够毫无后果地改变它。