1. 비트연산자 활용하기

public class ByteToStrTest {
    public static void main(String[] args) {
        System.out.println(bytesToBinaryString((byte) 2));
        System.out.println(bytesToBinaryString((byte) 30));
        System.out.println(bytesToBinaryString((byte) 0x80));
    }

    static String bytesToBinaryString(Byte b) {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < 8; i++) {
            builder.append(((0x80 >>> i) & b) == 0 ? '0' : '1');
        }

        return builder.toString();
    }
}

0x80을 int 형으로 바꾸면 1000 0000가 된다.
(0x80 >>> i) 로 최상위 비트인 1을 unsigned right shift로 한자리씩 이동하면서 b의 i번째 자리 비트가 1인지 0인지 확인해 문자열에 값을 추가하는 방식이다. (0x80 >>> i)가 1이므로 & 연산자에 의해 b의 i번째 비트의 값만을 확인할 수 있게된다.

만약 byte가 아닌 int를 binaryString으로 바꿀 거라면 동일한 원리로 0x80을 0x80000000로 바꾸기만 하면된다.

실행 결과

00000010
00011110
10000000

 

2. Integer.toBinaryString() 활용하기

자바에서는 10진수나 16진수의 정수를 비트 단위의 문자열로 간단하게 바꿀 수 있는 toBinaryString() 메서드를 제공한다.
이 메서드는 Integer 클래스의 메서드이므로, 매개변수로 byte 타입의 값을 넘겨주면 int형으로 자동으로 형변환이 되면서 이진수 값이 출력된다.

public class ByteToStrTest {

    public static void main(String[] args) {
        byte value = 30;

        String test1 = Integer.toBinaryString(0x12345678);
        String test2 = Integer.toBinaryString(2);
        String test3 = Integer.toBinaryString(value);

        System.out.println(test1);
        System.out.println(test2);
        System.out.println(test3);
    }
}

실행 결과

10010001101000101011001111000
10
11110

 

일정한 자리수에 맞춰 출력하기

toBinaryString()은 이진수가 0으로 시작할 경우 앞자리의 출력을 생략한다.
만약 0을 포함하여 byte 값을 8자리에 맞춰서 출력하고 싶다면 몇가지 방법이 있다.

  1. String.format()을 사용해 고정된 자리수에 맞춰 0을 채울 수 있다.
String.format("%08d", Integer.parseInt(value)) // 8자리에 맞춘다
  • %d - 정수값이 들어올 것이라는 의미
  • 0 - 빈 자리를 채울 문자
  • 8 - 문자열의 길이
  1. Integer.numberOfLeadingZeros()를 사용하자.
    numberOfLeadingZeros()는 가장 상위에 있는 1보다 앞자리에 있는 0의 개수를 세어 반환한다.
    반환받은 개수만큼 0으로 문자열을 만들어 비트 값의 앞에 붙여주면 된다.