Дополните двоичную строку, равную нулю ("0"), ведущими нулями в Java - PullRequest
9 голосов
/ 10 декабря 2011
Integer.toBinaryString(data)

дает мне двоичное строковое представление данных моего массива.

Однако я хотел бы добавить простой способ добавить к нему начальные нули, поскольку массив байтов, равный нулю, дает мне строку «0».это:

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

Является ли String.format() правильным подходом?Если да, какую format строку я должен использовать?Заранее спасибо!

Редактировать: Массив data имеет динамическую длину, поэтому должно быть число ведущих нулей.

Ответы [ 5 ]

16 голосов
/ 10 декабря 2011

Для заполнения, скажем, с 5 ведущими нулями, это будет работать:

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

Вы не указали ожидаемую длину строки, в приведенном выше примере кода, который я использовал 5, замените его на правильное значение.

EDIT

Я только что заметил комментарии. Конечно, вы можете построить шаблон динамически, но в какой-то момент вы должны знать максимальный ожидаемый размер, в зависимости от вашей проблемы, вы будете знать, как определить значение:

String formatPattern = "%" + maximumExpectedSize + "s";
2 голосов
/ 10 декабря 2011

Это то, что вы просили - заполнение добавляется только , когда значение равно нулю.

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() напрямую будет лучшим, но оно поддерживает только десятичные, шестнадцатеричные и восьмеричные, а не двоичные.

1 голос
/ 03 февраля 2014

Вы можете переопределить эту функцию в своем собственном классе:

    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);  
    }
0 голосов
/ 17 марта 2013

Это, по сути, почти то же самое, что и ответ @ Óscar Ló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() является лучшим методом.

Пенсионеры,
поправьте меня пожалуйста если я не прав.
Спасибо.

0 голосов
/ 10 декабря 2011

это удовлетворит ваши потребности?

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

edit: заметил комментарий о динамической длине: вероятно, некоторые другие ответы больше подходят:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...