일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 30 | 31 |
- 자바 스프링
- 이클립스
- 람다식
- 자바스프링
- node.js
- SQL 연산자
- spring
- 관계형데이터베이스
- 리액트
- 오산대맛집
- Hooks
- spring 환경설정
- Flexbox Froggy
- 타입
- 객체지향프로그래밍
- REACT
- ubuntu
- 스프링
- SQL
- Eclipse
- SQL 문제
- SQL 명령어
- HTML5
- numpy
- java설치
- 환경설정
- 노마드코더
- 플랙스박스기본
- Flex Box 기본
- java spring
- Today
- Total
이것저것
[Java] 비트연산자를 이용한 특정 자리수 구하기 본문
비트 연산자 계산법에 대해서 알아보겠다.
우선 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년 만에 깨달았다... 반성하자
'Java > Java 풀어본 문제' 카테고리의 다른 글
[Java] 구구단 문제 (0) | 2020.03.30 |
---|---|
[Java] Scanner로 두 수를 입력받아 합을 구하기 (0) | 2020.03.29 |