Как получить 0-дополненное двоичное представление целого числа в java?
например,1, 2, 128, 256 выход может быть (16 цифр):
0000000000000001
0000000000000010
0000000010000000
0000000100000000
пробовал
String.format("%16s", Integer.toBinaryString(1));
он ставит пробелы для левого заполнения:
` 1'
как поставить 0S для заполнения. Я не мог найти его в форматер. Есть ли другой способ сделать это?
спасибо заранее.
П. С. этот пост описывает, как форматировать целые числа с левым 0-заполнением, но это не для двоичного кода представление.
15 ответов:
Я думаю, что это неоптимальное решение, но вы могли бы сделать
String.format("%16s", Integer.toBinaryString(1)).replace(' ', '0')
в java нет встроенного двоичного преобразования.утиль.Форматер, я бы посоветовал вам либо использовать строку.заменить, чтобы заменить пробел нулями, как в:
String.format("%16s", Integer.toBinaryString(1)).replace(" ", "0")или реализовать свою собственную логику для преобразования целых чисел в двоичное представление с добавлением левого отступа где-то вдоль строк, приведенных в этой так. Или если вам действительно нужно передать числа в формат, вы можете преобразовать свое двоичное представление в BigInteger, а затем отформатировать его с помощью ведущего нулей, но это очень дорого во время выполнения, как в:
String.format("%016d", new BigInteger(Integer.toBinaryString(1)))
Я пробовал всевозможные вызовы методов, которые я действительно не использовал раньше, чтобы сделать эту работу, они работали с умеренным успехом, пока я не подумал о чем-то настолько простом, что это просто может сработать, и это произошло!
Я уверен, что это было задумано раньше, не уверен, что это хорошо для длинной строки двоичных кодов, но он отлично работает для 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;
вы можете использовать Apache Commons StringUtils. Он предлагает методы для заполнения строк:
StringUtils.leftPad(Integer.toBinaryString(1), 16, '0');
вот новый ответ на старый пост.
чтобы добавить двоичное значение с ведущими нулями к определенной длине, попробуйте следующее:
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 )
попробовать...
String.format("%016d\n", Integer.parseInt(Integer.toBinaryString(256)));Я не думаю, что это "правильный" способ делать это... но это работает :)
Я не знаю "правильное" решение, но я могу предложить вам быстрый патч.
String.format("%16s", Integer.toBinaryString(1)).replace(" ", "0");Я только что попробовал и увидел, что он отлично работает.
более простая версия идеи user3608934 "это старый трюк, создайте строку с 16 0, а затем добавьте обрезанную двоичную строку, которую вы получили":
private String toBinaryString32(int i) { String binaryWithOutLeading0 = Integer.toBinaryString(i); return "00000000000000000000000000000000" .substring(binaryWithOutLeading0.length()) + binaryWithOutLeading0; }
наивное решение, которое будет работать
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
Это старый трюк, создайте строку с 16 0, затем добавьте обрезанную двоичную строку, которую вы получили из строки.формат ("%s", целое число.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 ); } }
Я бы написал свой собственный класс util с помощью метода, как показано ниже
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;
этот метод преобразует int в строку, length=bits. Либо дополняется 0s или с наиболее значимыми битами усеченными.
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(); }
вы можете использовать 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
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). с помощью продолжить.
/ / ниже будет обрабатывать правильные размеры
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'); }
Comments