在Java中使用前导零填充等于零(“0”)的二进制字符串

Integer.toBinaryString(data) 

给我一个我的数组数据的二进制字符串表示。

但是我想要一个简单的方法来向它添加前导零,因为一个等于零的字节数组给我一个“0”字符串。

我想要像这样的单线:

 String dataStr = Integer.toBinaryString(data).equals("0") ? String.format(format, Integer.toBinaryString(data)) : Integer.toBinaryString(data); 

String.format()是正确的方法吗? 如果是,我应该使用什么format String? 提前致谢!

编辑: data数组具有动态长度,因此前导零的数量也应如此。

对于带有5个前导零的填充,这将起作用:

 String.format("%5s", Integer.toBinaryString(data)).replace(' ', '0'); 

你没有指定字符串的预期长度,在我用过的示例代码5中,用适当的值替换它。

编辑

我刚注意到这些评论。 当然你可以动态地构建模式,但在某些时候你必须知道最大的预期大小,这取决于你的问题,你会知道如何确定值:

 String formatPattern = "%" + maximumExpectedSize + "s"; 

这就是你要求的填充在值为零时添加。

 String s = (data == 0) ? String.format("%0" + len + 'd', 0) : Integer.toBinaryString(data); 

如果您真正想要的是填充所有二进制值以使它们具有相同的长度,我使用以下内容:

 String pad = String.format("%0" + len + 'd', 0); String s = Integer.toBinaryString(data); s = pad.substring(s.length()) + s; 

直接使用String.format()将是最好的,但它只支持十进制,hex和八进制,而不是二进制。

您可以在自己的类中覆盖该函数:

  public static String toBinaryString(int x){ byte[] b = new byte[32]; // 32 bits per int int pos = 0; do{ x = x >> 1; // /2 b[31-pos++] = (byte)(x % 2); }while(x > 0); return Arrays.toString(b); } 

这会满足你的需求吗?

 String dataStr = data == 0 ? "00" + Integer.toBinaryString(data) : Integer.toBinaryString(data); 

编辑:注意到关于动态长度的评论:可能其他一些答案更适合:)

在概念上,这与@ÓscarLópez答案几乎相同,但使用了不同的方法,所以我想我应该发布它。 希望这很好。

1]构建格式字符串

  String format = "%0" + totalDigits + "d"; 

2]整数到二进制转换

  String dataStr = Integer.toBinaryString(data); 

3]用前导零填充

  dataStr = String.format(format, new Integer(dataStr)); 

这里的主要区别是第3步。 我相信,它实际上是一个黑客。 @erickson在String.format()不支持二进制,因此,我将二进制数转换为整数(不等同于它),即“100”将转换为百(100),而不是四(4)。 然后我使用普通格式。

不知道这个代码有多少优化,但是,我认为它更容易阅读,但是,也许,它只是我。

编辑
1]缓冲区溢出可用于更长的二进制字符串。 可以使用很Long ,但是,即使这有限制。
2]可以使用BigInteger ,但是,我敢肯定,与其他所有方法相比,它在运行时成本最高。 因此,似乎除非只需要更短的二进制字符串,否则replace()是更好的方法。

老年人,
如果我错了,请纠正我。
谢谢。