이것저것

[Java] 비트연산자를 이용한 특정 자리수 구하기 본문

Java/Java 풀어본 문제

[Java] 비트연산자를 이용한 특정 자리수 구하기

곰태태 2020. 4. 15. 22:49
반응형
SMALL

비트 연산자 계산법에 대해서 알아보겠다.

우선 toBinaryString이란 숫자를 2진수로 변환해주는 명령어이다.

1
2
3
4
5
6
7
public static void main(String[] args) {
        int num = 100;
        String num1 = Integer.toBinaryString(num);
        System.out.println(num1);
        
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

num 100을 이진수로 변환해주는 코드이다.

toBinaryString을 통해 2진수로 변환시켜준 뒤 실습을 진행하면 수월할 수 있다.

 

예를들어 ae5e라는 16진수를 통해서 실습을 해보자

16진수 계산법은 10진수처럼 0부터 9까지는 동일하나 10부터 15까지는 a~e를 사용한다.

A B C D E F
10 11 12 13 14 15

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public static void main(String[] args) {
        int num = 0xae5e;
        String num1 = Integer.toBinaryString(num);
        System.out.println(num1);
        // 1010 1110 0101 1110 출력
        
        /*
         * 1010 1/110 010/1 1110으로  나눠서 각각 앞5자리 가운데 6자리 마지막 5자리를 출력해보자
         *   21     50      30        각각 나눈부분을 2진수로 계산해주면된다.
         * 처음에는 1010 1 부분을 뽑아내보자.
         * 1010 1은 1로 치환, 1010 1을 제외한 나머지부분을 0으로 치환을해준다.
         * -> 1111 1000 0000 0000
         * 0000 0000 0001 0101로 변환을 해줄 것이다 -> 쉬프트 연산자를 사용한다.(>>, <<, >>>)
        */
        
        // 1010 1 부분 출력하기
        int chg = num & 0xf800;        //0xf800은 1111 1000 0000 0000을 나타낸다.
        int first = chg >> 11;        //1010 1000 0000 0000 => 0000 0000 0001 0101로 쉬프트한다.
        System.out.println(first);    //21이 출력
        
        // 110 010 부분 출력하기
        int chg2 = num & 0x07e0;    
        int middle = chg2 >> 5;
        System.out.println(middle);
        
        // 1 1110 부분 출력하기
        int chg3 = num & 0x001f;
        int end = chg3;
        System.out.println(end);
}
 

 

먼저 ae5e를 2진수로 출력을 하게 되면
1010 1110 0101 1110 이 출력이 된다. 

 

1010 1/110 010/1 1110으로 임의로 나눈 뒤 3개의 부분을 각각 출력하도록 하는 코드를 짜보았다.

앞의 1010 1 부분을 추출하기 위해서는 1111 1000 0000 0000 과 &연산을 해주면 1이 들어간 곳만 뽑히게 된다.

ex)

   1010 1110 0101 1110

& 1111 1000 0000 0000

----------------------------

   1010 1000 0000 0000          이와 같이 추출이 된다.

위의 연산이 17번 코드인  "int chg = num & 0xf800" 부분이다.

0x는 16진수를 적으려면 항상 앞에 붙여줘야 한다.

f800은 1111 1000 0000 0000을 16진수로 변환해준 값이다.

 

출력된 1010 1000 0000 0000인 chg를 출력해주기 위해서는 쉬프트 연산자를 사용해야 한다.

int first = chg >> 11

'1010 1000 0000 0000'을 '0000 0000 0001 0101'로 변환해주기 위해서는 1010 1을 오른쪽으로 11번 이동시켜줘야 한다.

즉 >> 11은 chg를 오른쪽으로 11번 이동시켜준다는 뜻이다.

그렇게 해서 출력을 하게 된다면 21이라는 숫자가 출력되는 것을 확인할 수 있다.

 

1010 1/110 010/1 1110 을 각각 계산해보면

    21       50        30   이라는 값이 나온다. (나눠준 칸을 2진수로 계산해서 합을 해주면 된다.)

(16+4+1) / (32+16+2) / (16+8+4+2)

 

가운데와 마지막 구간을 출력해주는 코드를 작성은 해놓았지만

직접 공책에 16진수를 계산해보고 코드에 적용해보는 것이 도움이 많이 된다.

항상 비트 연산자 부분은 이해를 하지 못하고 넘어갔지만 이번에 직접 손으로 써보고 코드를 짜 보면서 이해할 수 있었다.

코딩은 컴퓨터로 하는 작업이지만 손으로 짜 보고 직접 계산을 해봐야 한다는 교수님의 말씀은 틀리지 않았다는 것을

4년 만에 깨달았다... 반성하자 

 

반응형
LIST

'Java > Java 풀어본 문제' 카테고리의 다른 글

[Java] 구구단 문제  (0) 2020.03.30
[Java] Scanner로 두 수를 입력받아 합을 구하기  (0) 2020.03.29
Comments