Как получить 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 ]

0 голосов
/ 29 марта 2018

// Ниже будем обрабатывать правильные размеры

public static String binaryString(int i) {
    return String.format("%" + Integer.SIZE + "s", Integer.toBinaryString(i)).replace(' ', '0');
}

public static String binaryString(long i) {
    return String.format("%" + Long.SIZE + "s", Long.toBinaryString(i)).replace(' ', '0');
}
0 голосов
/ 05 августа 2017
for(int i=0;i<n;i++)
{
  for(int j=str[i].length();j<4;j++)
  str[i]="0".concat(str[i]);
}

str[i].length() это длина числа, скажем, 2 в двоичном виде это 01, который является длиной 2 измените 4 на желаемую максимальную длину номера. Это можно оптимизировать до O (n). используя продолжить.

0 голосов
/ 15 ноября 2015

Вы можете использовать lib https://github.com/kssource/BitSequence.. Он принимает число и возвращает его по старшей строке, дополненной и / или сгруппированной.

String s = new BitSequence(2, 16).toBynaryString(ALIGN.RIGHT, GROUP.CONTINOUSLY));  
return  
0000000000000010  

another examples:

[10, -20, 30]->00001010 11101100 00011110
i=-10->00000000000000000000000000001010
bi=10->1010
sh=10->00 0000 0000 1010
l=10->00000001 010
by=-10->1010
i=-10->bc->11111111 11111111 11111111 11110110
0 голосов
/ 24 февраля 2015

Этот метод преобразует int в строку, длина = биты. Либо дополняется нулями, либо усекаются старшие значащие биты.

static String toBitString( int x, int bits ){
    String bitString = Integer.toBinaryString(x);
    int size = bitString.length();
    StringBuilder sb = new StringBuilder( bits );
    if( bits > size ){
        for( int i=0; i<bits-size; i++ )
            sb.append('0');
        sb.append( bitString );
    }else
        sb = sb.append( bitString.substring(size-bits, size) );

    return sb.toString();
}
0 голосов
/ 17 февраля 2015

Я бы написал свой собственный класс утилит следующим способом:

public class NumberFormatUtils {

public static String longToBinString(long val) {
    char[] buffer = new char[64];
    Arrays.fill(buffer, '0');
    for (int i = 0; i < 64; ++i) {
        long mask = 1L << i;
        if ((val & mask) == mask) {
            buffer[63 - i] = '1';
        }
    }
    return new String(buffer);
}

public static void main(String... args) {
    long value = 0b0000000000000000000000000000000000000000000000000000000000000101L;
    System.out.println(value);
    System.out.println(Long.toBinaryString(value));
    System.out.println(NumberFormatUtils.longToBinString(value));
}

}

Вывод:

5
101
0000000000000000000000000000000000000000000000000000000000000101

Такой же подход может быть применен к любомуинтегральные типы.Обратите внимание на тип маски

long mask = 1L << i;

0 голосов
/ 06 мая 2014

Это старый трюк, создайте строку с 16 нулями, затем добавьте обрезанную двоичную строку, полученную из String.format ("% s", Integer.toBinaryString (1)), и используйте самые правые 16 символов, выпадающийот любых ведущих 0.А еще лучше, сделайте функцию, которая позволит вам указать, какую длину двоичной строки вы хотите.Конечно, есть, вероятно, еще несколько способов сделать это, включая библиотеки, но я добавляю этот пост, чтобы помочь другу:)

public class BinaryPrinter {

    public static void main(String[] args) {
        System.out.format("%d in binary is %s\n", 1, binaryString(1, 4));
        System.out.format("%d in binary is %s\n", 128, binaryString(128, 8));
        System.out.format("%d in binary is %s\n", 256, binaryString(256, 16));
    }

    public static String binaryString( final int number, final int binaryDigits ) {
        final String pattern = String.format( "%%0%dd", binaryDigits );
        final String padding = String.format( pattern, 0 );
        final String response = String.format( "%s%s", padding, Integer.toBinaryString(number) );

        System.out.format( "\npattern = '%s'\npadding = '%s'\nresponse = '%s'\n\n", pattern, padding, response );

        return response.substring( response.length() - binaryDigits );
    }
}
...