[Java] Byte 값을 비트 단위로 출력하기 (이진수로 출력하기)
2019. 10. 11. 22:51
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자리에 맞춰서 출력하고 싶다면 몇가지 방법이 있다.
String.format()
을 사용해 고정된 자리수에 맞춰 0을 채울 수 있다.
String.format("%08d", Integer.parseInt(value)) // 8자리에 맞춘다
%d
- 정수값이 들어올 것이라는 의미0
- 빈 자리를 채울 문자8
- 문자열의 길이
Integer.numberOfLeadingZeros()
를 사용하자.
numberOfLeadingZeros()는 가장 상위에 있는 1보다 앞자리에 있는 0의 개수를 세어 반환한다.
반환받은 개수만큼 0으로 문자열을 만들어 비트 값의 앞에 붙여주면 된다.
'if (study) > Java & Kotlin' 카테고리의 다른 글
Java의 concurrent 패키지 알아보기 (2) Atomic Type 사용하기 (0) | 2020.03.25 |
---|---|
Java의 concurrent 패키지 알아보기 (1) Lock을 사용한 동기화 (0) | 2020.03.15 |
코루틴 이해하고 싶다 (0) | 2020.03.11 |