从String创建BigInteger并将“0”填充到它

问题描述 投票:0回答:1
[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); - >当我用base 16定义一个BigInt时(我刚刚在base2失败时尝试过),但是没有像上面那样的基数2。它会抛出一个格式化异常。

第2步:String pad=StringUtils.repeat("0",InputParam2);(重复0'InputParam2'次数) - >这很好用

第3步:需要在二进制文件前面附加填充(从Step1开始)对于BigInteger,我无法获得与.append类似的东西。所以我试图a)将这个BigInteger数字转换为String并且b)追加pad c)转换回BigInteger(这一步我没有创建新的BigInteger就无法获得)

对Step1和Step3-c的任何指示都会有所帮助。

java biginteger
1个回答
1
投票

#1 - 你还没有说过你在InputParam1中传递了什么值,但我的猜测是你传递的东西不是只包含'1'字符中'0'的字符串。构造函数的'radix'参数告诉代码如何解释你给它的字符串。这对我来说很好:

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

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

#3 - 没有数字(int,BigInteger等)的概念,前面没有填充,正如没有概念可以使用哪个base / radix来直观地表示数字。你可以从概念上考虑它,但这只是一种显示数字的方法。它与数字本身无关。

我之前没有尝试过,但似乎没有超级简单的方法来使用前导0来格式化Java中的二进制值,就像十进制和十六进制一样,因为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
© www.soinside.com 2019 - 2024. All rights reserved.