Integer.toBinaryString(data)
给我一个我的数组数据的二进制String表示。
但是我想要一个简单的方法来向它添加前导零,因为一个等于零的字节数组给我一个“0”字符串。
我想要像这样的单行:
String dataStr = Integer.toBinaryString(data).equals("0") ? String.format(format, Integer.toBinaryString(data)) : Integer.toBinaryString(data);
String.format()
是正确的做法吗?如果是,我应该使用format
字符串?
提前谢谢!
编辑:data
数组具有动态长度,前导零的数量也应如此。
答案 0 :(得分:15)
对于使用5个前导零填充,这将起作用:
String.format("%5s", Integer.toBinaryString(data)).replace(' ', '0');
你没有指定字符串的预期长度,在上面的示例代码中我使用了5,用适当的值替换它。
修改强>
我刚注意到这些评论。当然你可以动态地构建模式,但在某些时候你必须知道最大预期大小,这取决于你的问题,你将知道如何确定值:
String formatPattern = "%" + maximumExpectedSize + "s";
答案 1 :(得分:2)
这就是你要求的填充 - 当值为零时,只添加 。
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()
将是最好的,但它只支持十进制,十六进制和八进制,而不是二进制。
答案 2 :(得分:1)
您可以在自己的类中覆盖该函数:
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);
}
答案 3 :(得分:0)
这会满足您的需求吗?
String dataStr = data == 0 ? "00" + Integer.toBinaryString(data) : Integer.toBinaryString(data);
编辑:注意到有关动态长度的评论: 可能其他一些答案更适合:)
答案 4 :(得分:0)
这在概念上与@Ó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)。然后我使用了普通格式。
不确定此代码的优化程度,但是,我认为它更容易阅读,但也许只是我。
EDIT
1]缓冲区溢出可用于更长的二进制字符串。可以使用Long
,但即使这样也有局限性
2] BigInteger
可以使用,但是,我敢肯定,与所有其他方法相比,它在运行时将是最昂贵的。
所以,看起来,除非只需要更短的二进制字符串,replace()
是更好的方法。
老年人,
如果我错了,请纠正我
感谢。