
진법 (base-radix)
진법은 수를 셀 때, 자릿수가 올라가는 단위를 기준으로 하는 셈법의 총칭.
(”위치 적 기수 법”으로도 불림)
2진법(binary)
개요
- 2진법은 0과 1이라는 두 개의 숫자만을 사용하여 수를 나타내는 진법.
- 미적분학의 창시자 고트프리트 빌헬름 라이프니츠가 고안.
- 전자기기의 경우 신호를 특정 순서로 그룹 화 해 인지하기 때문에 2진법을 기반으로 발전.
- on(1), off(0)
표현 법
- 1의 보수(1's complement, 1'C)를 활용한 표현 법
- 0000 0100 (숫자 5)
- 1111 1010 (1의 보수에서 -5) ⇒ 비트 반전
- 2의 보수((2's complement, 2'C))를 활용한 표현 법
- 0000 0100 (숫자 5)
- 1111 1011 (2의 보수에서 -5) ⇒ 비트 반전 후 +1
2의 거듭제곱 220 219 218 217 216 215 214 213 212 211
| 10진수 표기 | 1048576 | 524288 | 262144 | 131072 | 65536 | 32768 | 16384 | 8192 | 4096 | 2048 | |
| 2진수 표기 | 100000000000000000000 | 10000000000000000000 | 1000000000000000000 | 100000000000000000 | 10000000000000000 | 1000000000000000 | 100000000000000 | 10000000000000 | 1000000000000 | 100000000000 | |
| 2의 거듭제곱 | 210 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
| 10진수 표기 | 1024 | 512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
| 2진수 표기 | 10000000000 | 1000000000 | 100000000 | 10000000 | 1000000 | 100000 | 10000 | 1000 | 100 | 10 | 1 |
ETC
- 2의 보수 표기는 10진수와 상호 변환이 가장 어려운 표기법.
- 컴퓨터를 포함한 전자기기는 2의 보수를 사용한다.
- 2의 보수는 연산에서 양수와 음수를 똑같이 취급할 수 있다는 이점이 있다.
- 이진 로그를 이용하면, 2진법으로 표기된 수를 좀 더 쉽게 다룰 수 있다.
- 시간 복잡도, 알고리즘 등의 정의에 사용.
- BCD(Binary-Coded Decimal) 코드
- 10진수의 각 자리수를 모두 분리해 각각 2진수 형태로 표현한 것.
- 365[10] ==> 0011(1) 0110(2) 0101(3) BCD
8진법(octal)
개요
- 0~7 범위의 숫자를 통해 숫자를 표현하는 진법.
표현 법
- 숫자 뒤에 (8) 또는 알파벳 o를 붙여 8진법임을 표시.
- 알파벳으로 표현이 가능하다.
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| l | s | n | m | t | u | o |
- 8진법을 컴퓨터에서 쓰는 이유는 자릿수 하나가 2^3을 표현할 수 있어서 2진수를 직관적으로 빠르게 변환 가능하기 때문.
- 8진법 ⇒ 2진법 변환
- 714(8) ⇒ 111(7)001(1)100(4) ⇒ 111001100(2)
- 2진법 ⇒ 8진법 변환
- 1의 자리부터 3개씩 끊어 변환해준다.
ETC
- UNIX 파일 액세스 권한 설정에 8진법이 사용.
- 실행 권한을 지정할 때 읽기, 쓰기, 실행 권한 3비트를 8진수 하나로 묶어 표기.
- C에서 8진법을 사용할 때는, 숫자 앞에 0을 붙이는 규칙이 존재.
int octal = 01234;
- 8진법은 7의 배수를 구하는데 최적화.
10진법(decimal)
개요
- 0~9 범위의 숫자를 통해 숫자를 표현하는 진법.
- 현대의 거의 모든 사람들이 기본으로 사용하는 진법.
- 10진법은 고대 이집트부터 전세계 통일.
상세
- 10진법이 정착된 가장 큰 이유는 손가락이 10개이기 때문.
- 손가락으로 2진법을 적용하면 1024 까지의 수를 셀 수 있다.
특징
- 10진법에서만 해당되는 수의 분류
피보나치수, 정n각수, n제곱수, 친화수, 부부수, 사교수,소수, 합성수, 약수의 개수가 n인 자연수, 소인수의 개수가 n인 자연수, 각 소인수 지수의 총합이 n인 자연수, 제곱인수가 없는 정수, 불가촉 수, 반완전수, 괴짜수, 두 소수의 합으로 나타내는 방법이 n가지인 수, n가지의 방법으로 표현할 수 있는 가장 작은 수, n가지 방법으로 표현할 수 있는 수의 개수, 두 소수의 합으로 나타내는 방법이 n가지일 때, 서로 다른 n가지 방법을 모두 썼을 때 사용되는 소수의 개수, 어떤 자연수의 모든 진약수의 합으로 나타내는 방법이 n가지인 자연수, n가지의 방법으로 나타낼 수 있는 가장 작은 수.
- 진법에 전혀 관계 없이 항상 그대로이다.
ETC
- 한국에서 숫자를 기록하거나 말할 때 초, 중, 후 를 나누는 기준
- 0~2 - 초반
- 3~6 - 중반
- 7~9 - 후반
12진법(duodemical)
개요
- 10진법처럼 숫자를 기록하는 방식.
- 4 이하의 모든 자연수의 최소공배수로 2, 3, 4, 6으로 나눠지므로 등분이 편리.
표현 법
- 18976(10) ⇒ 10 x 12^3 + 11 x 12^2 + 9 x 12 + 4 ⇒ AB94(12)
| A | B | 9 | 4 |
| 10 x 12^3 | 11 x 12^2 | 9 x 12 | 4 |
특징
- 시간 단위
- 시계, 달력, 황도 12궁, 십이지 및 갑오개혁 이전의 시간(자시, 오시) 등에서 볼 수 있듯 시간 쳬계에서 12를 한 단위로 쓰는 경우가 많다.
- 각도기 없이 고전적 방법으로 원(태양 주기)를 일정하게 나눌 때 12로 나누는 것이 이상적.
16진법(hexdecimal)
개요
- 0~15 범위의 숫자를 통해 숫자를 표현하는 진법.
- 컴퓨팅 분야의 숫자 표현 위한 진법 방식.
- 2진수의 가독성 향상을 위해 나온 진법 체계.
표현 법
- 10~15의 수는 A, B, C, D, E, F를 통해 표현.
| 1 | 2 | 3 | 4 | 5 |
| 1 | 2 | 3 | 4 | 5 |
| 6 | 7 | 8 | 9 | 10 |
| 6 | 7 | 8 | 9 | A |
| 11 | 12 | 13 | 14 | 15 |
| B | C | D | E | F |
- 16진법 ⇒ 2진법 변환
- 25FB(16) ⇒ 0010(2)0101(5)1111(F)1011(B) ⇒ 10010111111011(2)
- 2진법 ⇒ 16진법 변환
- 10111010101010101011110100010(2) ⇒ (000)1 0111 0101 0101 0101 0111 1010 0010 ⇒ 175557A2(16)
ETC
- C에서 16진법을 사용할 때는, 숫자 앞에 0x를 붙이는 규칙이 존재.
int hexdecmial = 0x1234;
- 컴퓨터에서 16진법을 사용하는 이유는, 자릿수 하나가 2^4를 표현할 수 있기 때문.
- 훈련된 상황이면 16진법의 숫자를 보고 바로 2진법 수로 변환이 가능하기 때문에 유용.
- 16진수로 표시되는 함수(SHA256)을 쓰는 비트코인과도 밀접한 관계를 갖는다.
- 블록 헤더를 구성하는 요소들도 0x가 들어간다.
60진법(sexagesimal)
개요
- 60을 한 묶음으로 하여 자릿수를 올려가는 방법.
- 시간을 재는데 주로 사용.
ETC
- 화씨 온도는 60진법을 기반으로 만들어졌다.
- 기하학에서 각도의 단위로 쓰였다.
- 인코딩 NewBase60은 대소문자를 구분해서 쓴다.
#include <stdio.h>
#define BIT 16
void printB(int num)
{
int MAX = BIT; // BIT MAX 지정
while (MAX--)
printf("%d", (num >> MAX) & 1); // 연산 및 표출
printf("\n");
}
int main()
{
int num = 0;
printf("INPUT => ");
scanf_s("%d", &num); // 10진수 입력 값
printf("NUM => %d",num);
printf("\n");
printf("\n* BINARY\n=> ");
printB(num); // 2진수
printf("* OCTAL\n");
printf("=> %o\n",num); // 8진수
printf("* HEXDECMIAL\n");
printf("=> %x", num); // 16진수
return (0);
}