[java] Java에서 정수의 0 패딩 이진 표현을 얻는 방법은 무엇입니까?

예를 들어 1, 2, 128, 256출력은 (16 자리) 일 수 있습니다.

0000000000000001
0000000000000010
0000000010000000
0000000100000000

나는 시도했다

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

왼쪽 패딩을위한 공백을 넣습니다.

`               1'

0패딩 에 s를 넣는 방법. Formatter 에서 찾을 수 없습니다 . 다른 방법이 있습니까?

추신 이 게시물 은 왼쪽 0 패딩으로 정수 형식을 지정하는 방법을 설명하지만 이진 표현은 아닙니다.



답변

이것이 차선책이라고 생각하지만 할 수 있습니다.

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


답변

java.util.Formatter에 내장 된 바이너리 변환은 없습니다. 다음과 같이 String.replace를 사용하여 공백 문자를 0으로 바꾸는 것이 좋습니다.

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

또는 주어진 라인을 따라 추가 왼쪽 패딩 곳 이진 표현으로 변환 정수로 자신의 논리를 구현 너무. 또는 숫자를 형식으로 전달해야하는 경우 이진 표현을 BigInteger로 변환 한 다음 선행 0으로 형식을 지정할 수 있지만 다음과 같이 런타임시 매우 비용이 많이 듭니다.

String.format("%016d", new BigInteger(Integer.toBinaryString(1)))


답변

Apache Commons StringUtils를 사용할 수 있습니다 . 패딩 문자열에 대한 메소드를 제공합니다.

StringUtils.leftPad(Integer.toBinaryString(1), 16, '0');


답변

저는이 작업을 수행하기 위해 이전에 실제로 사용하지 않은 모든 종류의 메서드 호출을 시도했습니다. 그들은 보통의 성공을 거두었습니다. 제가 너무나도 간단해서 작동 할 수도 있다는 생각이 들기 전까지는 성공했습니다.

나는 그것이 긴 이진 코드 문자열에 대해 좋은지 확실하지 않지만 16Bit 문자열에서는 잘 작동하는지 전에 생각했음을 확신합니다. 도움이 되었기를 바랍니다 !! (두 번째 코드가 개선되었습니다.)

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

이 답변을 개선하여 루프에서 작동하도록 도움을 준 Will에게 감사드립니다. 조금 어색 할 수도 있지만 작동합니다. 개선하고 가능한 경우 댓글을 달아주세요 ….

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;


답변

여기에 이전 게시물에 대한 새로운 답변이 있습니다.

이진 값을 선행 0으로 특정 길이로 채우려면 다음을 시도하십시오.

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

만약 len = 4val = 1,

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

문자열을 반환 한 "10001"다음

"10001".substring( 1 )

첫 번째 문자를 버립니다. 그래서 우리는 우리가 원하는 것을 얻습니다.

"0001"

val부정적 일 가능성이있는 경우 다음을 시도하십시오.

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


답변

user3608934의 아이디어에 대한 더 간단한 버전입니다. “이것은 오래된 트릭입니다. 16 0으로 문자열을 만든 다음 얻은 트리밍 된 이진 문자열을 추가합니다.”:

private String toBinaryString32(int i) {
    String binaryWithOutLeading0 = Integer.toBinaryString(i);
    return "00000000000000000000000000000000"
            .substring(binaryWithOutLeading0.length())
            + binaryWithOutLeading0;
}


답변

“올바른”해결책은 모르지만 빠른 패치를 제안 할 수 있습니다.

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

나는 그것을 시도했고 그것이 잘 작동하는 것을 보았다.