Crescendo Code
2진수, 8진수, 16진수, 각 진수와 10진수와의 변환 본문
Java 에서의 진법
자바는 10진수, 2진수, 8진수, 16진수를 모두 지원한다.
- 10진법 : 우리가 일반적으로 사용하는 0부터 9까지의 숫자를 이용해 수를 나타내는 진법
- 2진법 : 0과 1 두 개의 숫자만을 이용해 수를 나타내는 진법
- 8진법 : 0부터 7까지의 숫자를 이용해 수를 나타내는 진법
- 16진법 : 0부터 9까지의 숫자와 A부터 F까지의 문자로 수를 나타낸다. 숫자와 문자 총 16개로 표현하는 진법
자바에서 각 진수를 사용하기 위해서는 진수에 해당하는 리터럴 값 앞에 접두어를 추가로 붙여주어야 한다.
다음은 각각의 진수를 사용하기 위해 필요한 접두어이다.
진수 | 접두어 | 예시 |
10진수 | 없음 | 12 |
2진수 | 0b | 0b10 |
8진수 | 0 | 011 |
16진수 | 0x | 0x10 |
int i1 = 14;
int i2 = 0b1110;
int i3 = 016;
int i4 = 0xe;
- 위에서부터 10, 2, 8, 16진수로 나타낸 방식이며 전부 숫자 14를 나타낸다.
10 진법 (Decimal)
0부터 9까지의 숫자를 이용해 수를 나타낸다.
일상생활에서 보편적이며 가장 많이 사용하는 진법이지만 컴퓨터에서 사용하는 보편적인 진법은 아니다.
컴퓨터는 기본적으로 2진법으로 많이 구성되어 있으므로 연산도 2진법 연산이 가장 빠르지만 10진법에서 2진법으로의 변환은 까다롭기 때문에 8진법과 16진법이 등장했다.
▶ 10진수 → 2진수로의 변환
10진수로 표현한 숫자를 2로 계속 나누어 최종 몫과 나머지를 연결하면 된다.
예를 들어 숫자 50을 2진수로 나타내면 아래와 같다.
수식의 최종 몫과 나머지 부분을 보면 0과 1로만 구성되어 있는 숫자를 얻을 수 있다.
이를 아래에서부터 순서대로 작성하면 110010이 된다. 이 수가 10진수 50을 2진수로 변환한 수이다.
정수형 int의 경우 4byte의 메모리를 가지고 있는데 이를 bit로 환산하면 32bit만큼의 메모리를 지니고 있다.
50의 값을 이 메모리에 대입할 때엔 bit의 뒤에서부터 대입하면 된다.
즉, 0000 0000 0000 0000 0000 0000 0011 0010 이 값이 int 자료형 안에 들어간 50의 값을 이진법으로 나타낸 것이다.
▶ 10진수 → 8진수로의 변환
10진수로 표현한 숫자를 8로 계속 나누어 최종 몫과 나머지를 연결하면 된다.
10진수에서 2진수, 8진수, 16진수로 변경하는 방식은 기본적으로 모두 동일한 방식을 따른다.
10진수 50을 8진수로 변경하면 62임을 알 수 있다.
▶ 10진수 → 16진수로의 변환
10진수로 표현한 숫자를 16으로 계속 나누어 최종 몫과 나머지를 연결하면 된다.
10진수에서 2진수, 8진수, 16진수로 변경하는 방식은 기본적으로 모두 동일한 방식을 따른다.
10진수 50을 16진수로 변경하면 32임을 알 수 있다.
2 진법 (Binary)
0과 1 두 개의 숫자만을 이용해 수를 나타낸다.
컴퓨터나 전자기기 등에서 기본적으로 사용되는 진법으로 연산 속도가 가장 빠르다는 장점이 있다.
▶ 2진수 → 10진수로의 변환
2진수 1011을 10진수로 변환해 보자.
2진수는 각각의 자리에 해당하는 위치값이 있다.
2진수의 맨 뒷자리는 2의 0승, 그 앞자리는 2의 1승 이런 식으로 점차 앞자리로 올 때마다 2를 곱한 값이 위치하게 된다.
즉, 1011은 총 4자리의 숫자로 구성되어 있으므로 2의 0승 ~ 2의 3승까지의 위치값을 가지게 된다.
여기서 숫자 0이 아닌 1로 되어있는 부분의 위치값을 합한 값이 이 값을 10진수로 변환한 수이다.
즉, 이 식에서는 8, 2, 1 위치값이 1의 값을 가지므로 8 + 2 + 1 = 11이 이진수 1011의 십진수 값이 된다.
이를 식으로 하면 아래와 같다.
( 2^3 * 1 ) + ( 2^2 * 0 ) + ( 2^1 * 1 ) + ( 2^0 * 1 ) = 11
▶ 2진수 → 8진수로의 변환
2진수 110110101을 8진수로 변환해보자.
먼저, 2진수를 8진수로 변경하기 위해 2진수를 3자리씩 끊는다 → 110 110 101
세 자리로 구성된 숫자들을 각각 2진수에서 10진수로 변환하면 그 최종 결과가 8진수 값으로 나타난다.
110 110 101 → 6 6 5
즉 2진수 110110101을 8진수로 변환한 값은 665이다.
▶ 2진수 → 16진수로의 변환
이번에는 2진수 110110101을 16진수로 변환해 보자.
2진수를 16진수로 변환하기 위해서는 2진수를 4자리씩 끊는다.
단, 자릿수가 4자리로 맞아떨어지지 않을 때엔 앞에 0을 추가한다. → 0001 1011 0101
네 자리로 구성된 숫자들을 각각 2진수에서 10진수로 변환한다. → 1 11 5
16진수는 0~9까지의 숫자와 A~F까지의 문자를 사용하므로 9를 넘어선 수의 경우 문자로 변경한다. 11 → b
최종적으로 1b5가 2진수 110110101을 16진수로 변환한 값이 된다.
8진법 (Octal)
8진수는 2진수를 조금 더 편하게 사용하기 위해 개발되었지만 현재는 16진수가 사용되면서 많이 사용되지 않는다.
▶ 8진수 → 10진수로의 변환
8진수 264를 10진수로 변환해 보자.
8진수는 각각의 자리에 해당하는 위치값이 있다.
8진수의 맨 뒷자리는 8의 0승, 그 앞자리는 8의 1승 이런 식으로 점차 앞자리로 올 때마다 8을 곱한 값이 위치하게 된다.
즉, 264는 총 3자리의 숫자로 구성되어 있으므로 8의 0승 ~ 8의 2승까지의 위치값을 가지게 된다.
여기서 각 자리의 위치값에 아래 실값을 곱하고, 그 값들을 모두 더한 값이 최종적으로 10진수로 변환한 수가 된다.
식으로 쓰면 다음과 같다.
( 8^2 * 2 ) + ( 8^1 * 6 ) + ( 8^0 * 4 ) = 180
8진수 264를 10진수로 변환한 수는 180이다.
▶ 8진수 → 2진수로의 변환
8진수 264를 2진수로 변경해 보자.
먼저 8진수 264의 각 수를 분리해서 생각한다. 숫자 2, 4, 6으로 구성되어 있음을 알 수 있다.
그리고 각각의 수를 10진수 → 2진수 과정을 통해 2진수로 변환하는데
각 자리당 3개의 숫자를 할당한다.→ 2(010), 6(110), 4(100)
변환 과정을 통해 나온 수를 쭉 이어 붙이면 변환이 완료된다. 단, 앞에 0이 있다면 생략한다.
즉, 8진수 264를 2진수로 변환한 값은 10110100이다.
▶ 8진수 → 16진수로의 변환
8진수 264를 16진수로 변경해 보자.
8진수를 16진수로 변경하기 위해선 8진수를 2진수로 먼저 변경해야 한다.
8진수 → 2진수 변환 과정을 통해 2진수 값을 얻는다. → 10110100
이 수를 네 자리씩 분리한 뒤 2진수 → 16진수 변환 과정을 통해 16진수 값을 얻는다.
8진수를 16진수로 변환하기 위해선 8진수 → 2진수 → 16진수의 변환 과정을 거치며
8진수 264를 16진수로 변환한 값은 b4가 나오게 된다.
16진법 (Hexadecimal)
16진법은 0~9까지의 숫자와 A~F까지의 문자를 사용한다. A는 숫자 10을 의미하며 1씩 증가해 마지막 F는 15가 된다.
2진수를 조금 더 편하게 사용하기 위해 개발되었다.
▶ 16진수 → 10진수로의 변환
16진수 2f를 10진수로 변환해 보자.
16진수는 각각의 자리에 해당하는 위치값이 있다.
16진수의 맨 뒷자리는 16의 0승, 그 앞자리는 16의 1승 이런 식으로 점차 앞자리로 올 때마다 16을 곱한 값이 위치한다.
즉, 2f는 총 2자리의 숫자 또는 문자로 구성되어 있으므로 16의 0승 ~ 16의 1승까지의 위치값을 가지게 된다.
여기서 각 자리 위치값에 아래 실값을 곱하고, 그 값들을 모두 더한 값이 최종적으로 10진수로 변환한 수가 된다.
주의해야 할 점은 문자로 되어있는 값도 숫자로 변환해야 한다는 점이다. 위 식에서 문자 F는 15를 의미한다.
이를 식으로 쓰면 다음과 같다.
( 16^1 * 2 ) + ( 16^0 * 15 ) = 47
16진수 2f를 10진수로 변환한 값은 47이다.
▶ 16진수 → 2진수로의 변환
16진수 2f를 2진수로 변경해 보자.
먼저 16진수 2f의 각 자리를 분리해서 생각한다. 숫자 2, 문자 f로 구성되어 있음을 알 수 있다.
그리고 각각의 수를 10진수 → 2진수 과정을 통해 2진수로 변환하는데
각 자리당 4개의 숫자를 할당하고, 문자일 경우 숫자로 변경하여 처리한다. ( f → 15 취급 ) → 2(0010), f(1111)
변환 과정을 통해 나온 수를 쭉 이어 붙이면 변환이 완료된다. 단, 앞에 0이 있다면 생략한다.
즉, 16진수 2f를 2진수로 변환한 값은 101111이다.
▶ 16진수 → 8진수로의 변환
16진수 2f를 8진수로 변경해 보자.
16진수를 8진수로 변경하기 위해선 16진수를 2진수로 먼저 변경해야 한다.
16진수 → 2진수 변환 과정을 통해 2진수 값을 얻는다. → 101111
이 수를 세 자리씩 분리한 뒤 2진수 → 8진수 변환 과정을 통해 8진수 값을 얻는다.
16진수를 8진수로 변환하기 위해선 16진수 → 2진수 → 8진수의 변환 과정을 거치며
16진수 2f를 8진수로 변환한 값은 57이 나오게 된다.
'Back-End > Java' 카테고리의 다른 글
equals() 메서드와 hashCode() 메서드 (0) | 2023.06.05 |
---|