10진법과 2진법
우리가 일상생활에서 사용하는 것은 10진법에 익숙해져있다.
0~9까지의 숫자로 모든 숫자를 표현할 수 있는 것도 10진법을 사용해서이다.
하지만 대부분의 컴퓨터는 2진 체계로 설계되었기 때문에,
2진법을 알지 못하면 컴퓨터의 동작원리나 데이터 처리방식을 이해할 수 없다.
변수에 값을 저장하면 10진수로 저장되는 것처럼 보이지만,
실제로 컴퓨터는 2진수 밖에 모르기 때문에 다음과 같이 2진수로 바뀌어 저장된다.
int age = 24;
age 25 -> age 11001
비트와 바이트
한 자리의 2진수를 비트(bit)라고 하며, 1비트는 컴퓨터가 값을 저장할 수 있는 최소단위이다.
1비트 8개를 묶어서 바이트(byte)라는 단위로 정의해서 데이터의 기본 단위로 사용한다.
1비트는 한 자리의 2진수로 0과 1, 모두 2개의 값을
2비트는 두 자리의 2진수로 00, 01, 10, 11, 모두 4개의 값을 표현할 수 있다.
3비트는 다음과 같이 표현할 수 있다.
000 |
001 |
010 |
011 |
100 |
101 |
110 |
111 |
3비트는 총 8개의 값을 표현할 수 있고, 4비트는 16개의 값을 표현할 수 있다.
따라서, n비트로 2의n승개의 값을 표현할 수 있다.
또한 표현가능한 10진수의 범위는 0~2의n승-1 이 된다.
8진법과 16진법
2진법은 0과 1로만 표현되기 때문에 값이 자리수가 상당히 길어진다.
따라서 이러한 단점을 보완하기 위해 2진법 대신 8진법이나 16진법을 사용하곤 한다.
8진수는 2진수 3자리를, 16진수는 2진수 4자리를 각각 한자리로 표현할 수 있다.
8진법은 값을 표현하는데 8개의 기호가 필요하므로 0~7의 숫자를 기호로 사용하면 되지만,
16진법은 16개의 기호가 필요하므로 0~9의 숫자만으로 부족하다.
따라서 A~F의 문자를 추가로 사용한다.
0~9, A, B, C, D, E, F 이렇게 말이다.
그럼 이제 2진수를 8진수, 16진수로 변환하는 방법을 알아보자.
8진수는 2진수 3자리를, 16진수는 2진수 4자리를 끊어서 바꾸어 줄 수 있다.
다음 예시를 살펴보자.
1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 |
1010101100(2) 2진수가 있다.
먼저 8진수로 바꾸어보자.
2진수와 8진수의 관계는 다음과 같다.
2진수 | 8진수 |
000 | 0 |
001 | 1 |
010 | 2 |
011 | 3 |
100 | 4 |
101 | 5 |
110 | 6 |
111 | 7 |
앞서 설명했듯이 2진수를 3자리씩 끊으면 된다.
2진수 1010101100(2)을 1/010/101/100 이렇게 3자리씩 끊어보자.
다시 표를보면, 100은 4, 101은 5, 010은 2, 001은 1로
따라서 1254(8) 이렇게 변환할 수 있다.
16진법은 2진수를 4자리씩 끊으면 된다.
10/1010/1100 이렇게 4자리씩 끊어보자.
1100은 10진수 12로, 'C'로 표현되고
1010은 10진수 10으로, 'A'로 표현되고
0010은 10진수 2로, 그냥 2로 표현된다.
따라서 2AC(16) 이렇게 변환할 수 있다.
정수의 진법 변환
10진수를 n진수로 변환
10진수를 n진수로 변환하는 알고리즘과 실습프로그램은 [JAVA-algorithm] 기수변환 글에 있습니다.
n진수를 10진수로 변환
어떠한 진법의 수라도 10진수로 변환하는 방법은 같다.
각 자리의 수에 해당 단위의 값을 곱해서 모두 더하면 된다.
다음 예시를 살펴보자.
2진수 1010(2) 을 10진수로 변환하면
2의1승 + 2의3승 = 10 이 된다.
8진수 1460(8) 을 10진수로 변환하면
8의1승 * 6 + 8의2승 * 4 + 8의3승 * 1 =
48 + 256 + 512 = 816 이 된다.
16진수 64F(16) 을 10진수로 변환하면
16의0승 * F + 16의1승 * 4 + 16의2승 * 6 =
F * 1 + 64 + 1536 = 1615(10) 이 된다.
여기서 F는 10진수로 15이므로 15*1과 같다.
'JAVA > Basic' 카테고리의 다른 글
[JAVA-basic] 다차원 배열 (0) | 2021.08.09 |
---|---|
[JAVA-basic] String배열 (0) | 2021.08.06 |
[JAVA-basic] 배열 (0) | 2021.08.04 |
[JAVA-basic] 형변환 (0) | 2021.07.28 |
[JAVA-basic] 변수와 상수 (0) | 2021.07.26 |