如何在java中获得整数的0填充二进制表示?

kha*_*hik 113 java binary string-formatting

例如,1, 2, 128, 256输出可以是(16位):

0000000000000001
0000000000000010
0000000010000000
0000000100000000
Run Code Online (Sandbox Code Playgroud)

我试过了

String.format("%16s", Integer.toBinaryString(1));
Run Code Online (Sandbox Code Playgroud)

它为左边填充放置空格:

`               1'
Run Code Online (Sandbox Code Playgroud)

如何将0s用于填充.我在Formatter中找不到它.还有另一种方法吗?

提前致谢.

PS 这篇文章描述了如何使用左0填充格式化整数,但它不适用于二进制表示.

Sam*_*age 183

我认为这是一个次优的解决方案,但你可以做到

String.format("%16s", Integer.toBinaryString(1)).replace(' ', '0')
Run Code Online (Sandbox Code Playgroud)

  • 是的,我现在这样做,但我相信应该有另一种方式:) 谢谢。 (2认同)

Zor*_*art 18

java.util.Formatter中没有构建二进制转换,我建议您使用String.replace将空格字符替换为零,如下所示:

String.format("%16s", Integer.toBinaryString(1)).replace(" ", "0")
Run Code Online (Sandbox Code Playgroud)

或者实现你自己的逻辑来整数转换为沿中给出的线某处加左填充二进制表示如此.或者,如果您确实需要将数字传递给格式化,则可以将二进制表示形式转换为BigInteger,然后使用前导零格式化,但这在运行时非常昂贵,如:

String.format("%016d", new BigInteger(Integer.toBinaryString(1)))
Run Code Online (Sandbox Code Playgroud)


Bun*_*rro 12

您可以使用Apache Commons StringUtils.它提供了填充字符串的方法:

StringUtils.leftPad(Integer.toBinaryString(1), 16, '0');
Run Code Online (Sandbox Code Playgroud)


Tom*_*cer 8

我正在尝试各种各样的方法调用,我之前没有真正使用过这些调用,它们取得了一定的成功,直到我想到了一些非常简单的东西,它可能会起作用,而且确实如此!

我确信它之前已被考虑过,不确定它对于长字符串二进制代码是否有用,但它适用于16Bit字符串.希望能帮助到你!!(注意第二段代码得到改进)

String binString = Integer.toBinaryString(256);
  while (binString.length() < 16) {    //pad with 16 0's
        binString = "0" + binString;
  }
Run Code Online (Sandbox Code Playgroud)

感谢Will帮助改进这个答案,使其无需循环.这可能有点笨拙但它有效,如果可以,请改进并评论....

binString = Integer.toBinaryString(256);
int length = 16 - binString.length();
char[] padArray = new char[length];
Arrays.fill(padArray, '0');
String padString = new String(padArray);
binString = padString + binString;
Run Code Online (Sandbox Code Playgroud)

  • 威尔 - 你太聪明了,我现在就把它放入我的代码中!我也不喜欢循环,谢谢! (2认同)

小智 7

这是旧帖子的新答案.

要将带有前导零的二进制值填充到特定长度,请尝试以下操作:

Integer.toBinaryString( (1 << len) | val ).substring( 1 )
Run Code Online (Sandbox Code Playgroud)

如果len = 4val = 1,

Integer.toBinaryString( (1 << len) | val )
Run Code Online (Sandbox Code Playgroud)

"10001"然后返回字符串

"10001".substring( 1 )
Run Code Online (Sandbox Code Playgroud)

抛弃第一个角色.所以我们得到了我们想要的:

"0001"
Run Code Online (Sandbox Code Playgroud)

如果val可能是负面的,请尝试:

Integer.toBinaryString( (1 << len) | (val & ((1 << len) - 1)) ).substring( 1 )
Run Code Online (Sandbox Code Playgroud)


ben*_*nto 5

user3608934 想法的更简单版本“这是一个老技巧,创建一个包含 16 个 0 的字符串,然后附加您得到的修剪后的二进制字符串”:

private String toBinaryString32(int i) {
    String binaryWithOutLeading0 = Integer.toBinaryString(i);
    return "00000000000000000000000000000000"
            .substring(binaryWithOutLeading0.length())
            + binaryWithOutLeading0;
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*ane 5

从Java 11开始,您可以使用repeat(...)方法:

"0".repeat(Integer.numberOfLeadingZeros(i) - 16) + Integer.toBinaryString(i)
Run Code Online (Sandbox Code Playgroud)

或者,如果您需要任何整数的 32 位表示:

"0".repeat(Integer.numberOfLeadingZeros(i != 0 ? i : 1)) + Integer.toBinaryString(i)
Run Code Online (Sandbox Code Playgroud)