当前位置: 首页 > 面试题库 >

BigInteger到byte []

姜卜霸
2023-03-14
问题内容

我需要将Java
BigInteger实例转换为以字节为单位的值。从API中,我获得了此方法toByteArray(),该方法返回一个byte
[],其中包含此BigInteger的二进制补码表示形式。

因为我所有的数字都是正的128位(16字节)整数,所以我不需要2的补码形式,即给我128位+符号位(129位)…

有没有一种方法可以直接从BigInteger获取标准(无2的补码形式)表示形式?

如果不是,我如何右移整个byte [17]数组以丢失符号位,以获得一个byte [16]数组?


问题答案:

您根本不需要移动。符号位是字节数组中的最高有效(=最左边)位。由于您知道数字始终为正,因此可以保证它为0。但是,整个数组都是右对齐的。

因此有两种情况:您最左边的字节是否为0x00。如果它是0x00,则可以放心地删除它:

byte[] array = bigInteger.toByteArray();
if (array[0] == 0) {
    byte[] tmp = new byte[array.length - 1];
    System.arraycopy(array, 1, tmp, 0, tmp.length);
    array = tmp;
}

如果它不为0,则不能删除它-但是数组将已经在所需的表示形式中,因此您无需执行任何操作。

上面的代码在两种情况下均适用。



 类似资料:
  • 描述 (Description) java.math.BigInteger.modPow(BigInteger exponent, BigInteger m)返回一个BigInteger,其值为(this exponent mod m)。 与pow不同,此方法允许负指数。 声明 (Declaration) 以下是java.math.BigInteger.modPow()方法的声明。 public

  • 问题内容: 在Java中,大多数基本类型都是带符号的(一位用于表示+/-),因此当我超出类型的限制时,我会得到意外的结果,例如负数。 有什么比使用BigInteger更好的解决方案了,因为BigInteger存在性能问题,并且您需要对基本算术使用类方法而不是语言运算符(以提高可读性)? 问题答案: 不,没有更好的解决方案。如果您使用的值不能为长整型或双精度型,那么您将需要使用诸如的引用类型,并且J

  • 描述 (Description) java.math.BigInteger.xor(BigInteger val)返回一个BigInteger,其值为(this ^ val)。 当且仅当this和val中的一个为负时,此方法返回负BigInteger。 声明 (Declaration) 以下是java.math.BigInteger.xor()方法的声明。 public BigInteger xo

  • 描述 (Description) java.math.BigInteger.subtract(BigInteger val)返回一个BigInteger,其值为(this - val)。 声明 (Declaration) 以下是java.math.BigInteger.subtract()方法的声明。 public BigInteger subtract(BigInteger val) 参数 (

  • 描述 (Description) java.math.BigInteger.remainder(BigInteger val)返回一个BigInteger,其值为(this%val)。 声明 (Declaration) 以下是java.math.BigInteger.remainder()方法的声明。 public BigInteger remainder(BigInteger val) 参数

  • 描述 (Description) java.math.BigInteger.or(BigInteger val)返回一个BigInteger,其值为(this | val)。 当且仅当this或val为负时,此方法返回负BigInteger。 声明 (Declaration) 以下是java.math.BigInteger.or()方法的声明。 public BigInteger or(BigIn