我试图将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的开局时已经填补了。
有谁知道如何解决这个问题?
非常感谢 希夫
答案 0 :(得分:2)
如果您正在进行位移,则可能使用长无符号值而不是有符号值。因此,当您创建BigInteger
时,请使用此构造函数:
new BigInteger(1, vcwManD);
通过这种方式,您可以确保获得正数,并且您应该能够将其转移而不会产生任何后果。
答案 1 :(得分:1)
使用二进制补码将负数存储在内存中。这意味着如果数字为负数,则第一位将为1.当您向右移位负数时,它必须保持为负数,因此新引入的值将为1。