Как получить 0-дополненное двоичное представление целого числа в Java? - PullRequest
104 голосов
/ 12 декабря 2010

например, для 1, 2, 128, 256 вывод может быть (16 цифр):

0000000000000001
0000000000000010
0000000010000000
0000000100000000

Я пытался

String.format("%16s", Integer.toBinaryString(1));

ставит пробелы для заполнения слева:

`               1'

Как поставить 0 s для заполнения. Я не смог найти его в Formatter . Есть ли другой способ сделать это?

P.S. этот пост описывает, как форматировать целые числа с левым 0-отступом, но это не для двоичного представления.

Ответы [ 16 ]

171 голосов
/ 12 декабря 2010

Я думаю, что это неоптимальное решение, но вы могли бы сделать

String.format("%16s", Integer.toBinaryString(1)).replace(' ', '0')
18 голосов
/ 12 декабря 2010

В java.util.Formatter нет встроенного двоичного преобразования, я бы посоветовал вам либо использовать String.replace, чтобы заменить символ пробела нулями, как в:

String.format("%16s", Integer.toBinaryString(1)).replace(" ", "0")

Или реализуйте свою собственную логику для преобразования целых чисел в двоичное представление с добавлением левого отступа где-то вдоль строк, указанных в this . Или, если вам действительно нужно передать числа для форматирования, вы можете преобразовать свое двоичное представление в BigInteger, а затем отформатировать его с ведущими нулями, но это очень дорого во время выполнения, например:

String.format("%016d", new BigInteger(Integer.toBinaryString(1)))
11 голосов
/ 08 мая 2013

Вы можете использовать Apache Commons StringUtils .Предлагает методы для заполнения строк:

StringUtils.leftPad(Integer.toBinaryString(1), 16, '0');
8 голосов
/ 12 октября 2012

Я пробовал все виды вызовов методов, которые я до сих пор не использовал, чтобы сделать эту работу, они работали с умеренным успехом, пока я не подумал о чем-то настолько простом, что это могло бы просто сработать, и это сработало! *

Я уверен, что об этом уже думали, но не уверен, что это хорошо для длинной строки двоичных кодов, но отлично работает для 16-битных строк. Надеюсь, поможет!! (Обратите внимание, что второй фрагмент кода улучшен)

String binString = Integer.toBinaryString(256);
  while (binString.length() < 16) {    //pad with 16 0's
        binString = "0" + binString;
  }

Спасибо Уиллу за помощь в улучшении этого ответа, чтобы он работал без цикла. Это может быть немного неуклюже, но это работает, пожалуйста, улучшите и прокомментируйте, если можете ....

binString = Integer.toBinaryString(256);
int length = 16 - binString.length();
char[] padArray = new char[length];
Arrays.fill(padArray, '0');
String padString = new String(padArray);
binString = padString + binString;
6 голосов
/ 28 января 2015

Здесь новый ответ на старый пост.

Чтобы дополнить двоичное значение начальными нулями до определенной длины, попробуйте следующее:

Integer.toBinaryString( (1 << len) | val ).substring( 1 )

Если len = 4 и val = 1,

Integer.toBinaryString( (1 << len) | val )

возвращает строку "10001", затем

"10001".substring( 1 )

отбрасывает самого первого персонажа. Итак, мы получаем то, что хотим:

"0001"

Если val может быть отрицательным, попробуйте:

Integer.toBinaryString( (1 << len) | (val & ((1 << len) - 1)) ).substring( 1 )
3 голосов
/ 19 июня 2014

Более простая версия идеи user3608934 «Это старый трюк, создайте строку с 16 нулями, а затем добавьте полученную обрезанную двоичную строку»:

private String toBinaryString32(int i) {
    String binaryWithOutLeading0 = Integer.toBinaryString(i);
    return "00000000000000000000000000000000"
            .substring(binaryWithOutLeading0.length())
            + binaryWithOutLeading0;
}
3 голосов
/ 12 декабря 2010

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

String.format("%16s", Integer.toBinaryString(1)).replace(" ", "0");

Я только что попробовал его и увидел, что он работает нормально.

3 голосов
/ 12 декабря 2010

попробуй ...

String.format("%016d\n", Integer.parseInt(Integer.toBinaryString(256)));

Не думаю, что это "правильный" способ сделать это ... но он работает :)

1 голос
/ 17 марта 2015

Наивное решение, которое будет работать, будет

String temp = Integer.toBinaryString(5);
while (temp.length() < Integer.SIZE) temp = "0"+temp; //pad leading zeros
temp = temp.substring(Integer.SIZE - Short.SIZE); //remove excess

Еще один метод будет

String temp = Integer.toBinaryString((m | 0x80000000));
temp = temp.substring(Integer.SIZE - Short.SIZE);

Это приведет к 16-битной строке целого числа 5

0 голосов
/ 10 апреля 2019
import java.util.Scanner;
public class Q3{
  public static void main(String[] args) {
    Scanner scn=new Scanner(System.in);
    System.out.println("Enter a number:");
    int num=scn.nextInt();
    int numB=Integer.parseInt(Integer.toBinaryString(num));
    String strB=String.format("%08d",numB);//makes a 8 character code
    if(num>=1 && num<=255){
     System.out.println(strB);
    }else{
        System.out.println("Number should be in range between 1 and 255");
    }
  }
}
...