본문 바로가기
카테고리 없음

int -> binary string 로 표현하기

by simongs 2020. 7. 19.

배경

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

Reference

댓글