从String创建一个BigInteger并将其填充为“ 0”

时间:2019-03-08 21:27:22

标签: java biginteger

[InputParam1:Decimal Number in String format(for Eg:30),
 InputParam2:Integer to denote number of repeating 0's to append(for Eg:6)]

要将数字从“十进制”转换为“二进制”,然后将填充数字转换为前位,我需要执行以下步骤:

第1步: BigInteger binary=new BigInteger(InputParam1,2); ->当我定义一个以底数为16的BigInt(当base2失败时我刚刚尝试过)但没有像上面那样的以2为底的BigInt时,此方法有效。 它将引发数字格式异常。

第2步: String pad=StringUtils.repeat("0",InputParam2); (重复0次“ InputParam2”的次数) ->效果很好

第3步:需要在二进制文件的前面附加填充符(从Step1开始) 对于BigInteger,我无法获得类似于.append的东西。 因此,我正在尝试a)将此BigInteger数字转换为String,然后b)附加填充c)转换回BigInteger(这一步,如果不创建新的BigInteger,我将无法获得)

关于Step1和Step3-c的任何指针都将对您有所帮助。

1 个答案:

答案 0 :(得分:1)

#1-您还没有说要在 InputParam1 中传递什么值,但是我猜测您要传递的内容不是'1中仅包含'0'的字符串'个字符。构造函数的'radix'参数告诉代码如何解释您提供的字符串。这对我来说很好:

BigInteger binary=new BigInteger("1000",2);
System.out.println(binary);

构造数字的方式与最终要表示或显示该数字的方式无关。这里的关键思想是数字(十六进制,十进制,二进制)的表示形式与数字本身无关,就像前导零不会影响数字的值一样。 1111 二进制,十六进制的 f 和十进制的 15 都是相同的数字。如果将这三个参数分别传递给BigDecimal的构造函数,其基数分别为 2 16 10 ,则最终将得到在每种情况下都是一样的。该对象将失去您用于将其设置为其初始值的哪种表示形式的概念。

#3-前面没有零填充的数字(int,BigInteger等)没有概念,就像您没有概念可以用视觉表示数字的基数/基数一样。您可以从概念上进行思考,但这只是显示数字的一种方式。与数字本身无关。

我以前没有尝试过,但是似乎没有一种超级简单的方法可以在Java中用前导0格式化二进制值,就像十进制和十六进制一样,因为String.format()没有给出格式二进制说明符。根据此StackOverflow帖子How to get 0-padded binary representation of an integer in java?的介绍,这似乎是最好的方法,已将最受接受的答案转换为可与BigInteger配合使用:

String str = String.format("%16s", binary.toString(2)).replace(' ', '0');

这是我所有的示例代码,输出:

BigInteger binary=new BigInteger("1000",2);
System.out.println(binary);
String str = String.format("%16s", binary.toString(2)).replace(' ', '0');
System.out.println(str);

输出:

8
0000000000001000