在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()
是更好的方法。
老年人,
如果我错了,请纠正我。
谢谢。