移位负整数-Java

移位负整数-Java,java,bit-manipulation,biginteger,bit-shift,Java,Bit Manipulation,Biginteger,Bit Shift,我正在尝试将一个7字节数组右移7位 为此,我使用BigInteger的shiftright方法。但是,当为负大整数右移时,会添加1填充,有时会删除前导位 以下是执行换档的代码位: byte[] vcwManD = decryptedVCW; BigInteger bigIntD = new BigInteger(vcwManD); // create big int array for shift BigInteger shiftIntD= bigIntD.shiftRight(7)

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

为此,我使用BigInteger的shiftright方法。但是,当为负大整数右移时,会添加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:

111010000110010000010110111101010011110001100100100001000

移位时,我得到二进制的D0CA06F538C8:

1101000011000000001101111010100111100011001000

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

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

100100001011001100010010101000101000101000101101111001000011000

以二进制形式生成FF213312A346F2:

11111111 00100001011000100101010001010001011011110010

这一次大约7 1的已填充在开始

有人知道如何解决这个问题吗

非常感谢
Shiv

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

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

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

new BigInteger(1, vcwManD);

这样,您就可以保证有一个正数,并且应该能够在不产生任何后果的情况下对其进行移位。

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

new BigInteger(1, vcwManD);

这样你就可以保证你有一个正数,并且你应该能够在不产生任何后果的情况下对它进行移位。

你可能不应该使用
biginger
来处理二进制数据。顺便说一句,将整数右移7等于除以2^7=128。From:“无符号右移运算符(>>)省略,因为该操作与该类提供的“无限字长”抽象结合起来没有什么意义。“我尝试使用带掩码的long和>>,但是我不知道是否可能小于8位移位的倍数。谢谢@HannoBinder,除以2^7也可以。您可能不应该使用
biginger
来处理二进制数据。顺便说一句,将整数右移7等于除以2^7=128。From:“无符号右移运算符(>>>)被省略,因为此操作与“无限字长”组合在一起没有什么意义“此类提供的抽象。”我尝试使用带掩码的long和>>,但我不知道是否可能小于8位移位的倍数。感谢@HannoBinder,除以2^7也可以。”您需要使用无符号变量类型来解决此问题。“-那将是什么Java类型?;-)使用long可以吗?@SHIV是的,因为您只有7个字节,long是8个字节,所以您可以将数据放入非负的long值中。“您需要使用无符号变量类型来解决此问题。”-那将是什么Java类型?;-)使用long可以吗?@SHIV是的,因为只有7个字节,long是8个字节,所以可以将数据放入非负long值中。