배경
https://hyperskill.org/projects/58/stages/315/implement
구현필요부분
File로부터 byte[]을 읽어들어오기
byte[] bytes;
try (InputStream inputStream = new FileInputStream(in)) {
bytes = inputStream.readAllBytes();
}
byte -> binaryString 변환
String binaryString = Integer.toBinaryString((b & 0xFF) + 0x100).substring(1)
Q1. int 와 byte는 어떠한 차이를 가지고 있는가?
- int는 4 바이트 (32비트), byte는 1 바이트 (8비트)로 구성된다.
- 제일 앞비트는 Sign비트는 0이면 양수 1이면 음수를 나타낸다.
- 그리하여 byte는 -128 ~ 127 까지의 수를 나타낼 수 있다.
- 10000000 = -128
- 01111111 = 127
- int i = 175 이 byte b = (byte)i 로 넘어가면 무슨일이 벌어지는가
- (int i = 175) 00000000 00000000 00000000 10101111 => 175
- (byte b = (byte)i) 10101111 => -81
- (int i2 = (int) b) 11111111 11111111 11111111 10101111 => -81
Q2. 왜 byte & 0xFF 를 하는가?
- Integer.toBinaryString(int i) 메소드를 호출한다.
- 이때 byte 는 integer 로 형변환이 일어난다.
- byte가 1로 시작하면 음수를 의미하게 되고 형변환시 부호비트를 따라 확장하게 된다.
- 이때 0~255 표현의 양수 의미를 유지시키기 위해서 0xFF 를 마스크로 사용한다.
- 이때 byte는 int 형으로 확장된다. (0xFF 는 int 형이다)
- 11111111 11111111 11111111 10101111 ((int)b)
- 00000000 00000000 00000000 11111111 (OxFF)
- 00000000 00000000 00000000 10101111 (byte & 0xFF)
Q3. 0x100 는 무엇을 의미하는가?
- 00000000 00000000 00000001 00000000 (Ox100) 을 의미한다.
- Integer.toBinaryString(1) 을 찍으면 1이 나온다.
- 이를 00000001 로 표현하기 위해 앞선 비트 1개를 더 만들어서 제거하는 방법을 사용한다.
- Integer.toBinaryString((1 & 0xFF) + 0x100).substring(1) => 00000001 을 출력한다.
Test Sample
1
1
10010110
11111111111111111111111110010110
댓글