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

时间:2011-12-10 15:50:44

标签: java string

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数组具有动态长度,前导零的数量也应如此。

5 个答案:

答案 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()是更好的方法。

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