byidev.com
2023-05-11 12:02:42

진법 (base-radix)

진법은 수를 셀 때, 자릿수가 올라가는 단위를 기준으로 하는 셈법의 총칭.

(”위치 적 기수 법”으로도 불림)


2진법(binary)

개요

  1. 2진법은 0과 1이라는 두 개의 숫자만을 사용하여 수를 나타내는 진법.
  2. 미적분학의 창시자 고트프리트 빌헬름 라이프니츠가 고안.
  3. 전자기기의 경우 신호를 특정 순서로 그룹 화 해 인지하기 때문에 2진법을 기반으로 발전.
  4. on(1), off(0)

표현 법

  1. 1의 보수(1's complement, 1'C)를 활용한 표현 법
    1. 0000 0100 (숫자 5)
    2. 1111 1010 (1의 보수에서 -5) ⇒ 비트 반전
  2. 2의 보수((2's complement, 2'C))를 활용한 표현 법
    1. 0000 0100 (숫자 5)
    2. 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

  1. 2의 보수 표기는 10진수와 상호 변환이 가장 어려운 표기법.
  2. 컴퓨터를 포함한 전자기기는 2의 보수를 사용한다.
  3. 2의 보수는 연산에서 양수와 음수를 똑같이 취급할 수 있다는 이점이 있다.
  4. 이진 로그를 이용하면, 2진법으로 표기된 수를 좀 더 쉽게 다룰 수 있다.
    1. 시간 복잡도, 알고리즘 등의 정의에 사용.
  5. BCD(Binary-Coded Decimal) 코드
    1. 10진수의 각 자리수를 모두 분리해 각각 2진수 형태로 표현한 것.
    2. 365[10] ==> 0011(1) 0110(2) 0101(3) BCD

8진법(octal)

개요

  1. 0~7 범위의 숫자를 통해 숫자를 표현하는 진법.

표현 법

  1. 숫자 뒤에 (8) 또는 알파벳 o를 붙여 8진법임을 표시.
  2. 알파벳으로 표현이 가능하다.
1 2 3 4 5 6 7
l s n m t u o
  1. 8진법을 컴퓨터에서 쓰는 이유는 자릿수 하나가 2^3을 표현할 수 있어서 2진수를 직관적으로 빠르게 변환 가능하기 때문.
  2. 8진법 ⇒ 2진법 변환
    1. 714(8) ⇒ 111(7)001(1)100(4) ⇒ 111001100(2)
  3. 2진법 ⇒ 8진법 변환
    1. 1의 자리부터 3개씩 끊어 변환해준다.

ETC

  1. UNIX 파일 액세스 권한 설정에 8진법이 사용.
  2. 실행 권한을 지정할 때 읽기, 쓰기, 실행 권한 3비트를 8진수 하나로 묶어 표기.
  3. C에서 8진법을 사용할 때는, 숫자 앞에 0을 붙이는 규칙이 존재.
int octal = 01234;
  1. 8진법은 7의 배수를 구하는데 최적화.

10진법(decimal)

개요

  1. 0~9 범위의 숫자를 통해 숫자를 표현하는 진법.
  2. 현대의 거의 모든 사람들이 기본으로 사용하는 진법.
  3. 10진법은 고대 이집트부터 전세계 통일.

상세

  1. 10진법이 정착된 가장 큰 이유는 손가락이 10개이기 때문.
  2. 손가락으로 2진법을 적용하면 1024 까지의 수를 셀 수 있다.

특징

  1. 10진법에서만 해당되는 수의 분류

피보나치수, 정n각수, n제곱수, 친화수, 부부수, 사교수,소수, 합성수, 약수의 개수가 n인 자연수, 소인수의 개수가 n인 자연수, 각 소인수 지수의 총합이 n인 자연수, 제곱인수가 없는 정수, 불가촉 수, 반완전수, 괴짜수, 두 소수의 합으로 나타내는 방법이 n가지인 수, n가지의 방법으로 표현할 수 있는 가장 작은 수, n가지 방법으로 표현할 수 있는 수의 개수, 두 소수의 합으로 나타내는 방법이 n가지일 때, 서로 다른 n가지 방법을 모두 썼을 때 사용되는 소수의 개수, 어떤 자연수의 모든 진약수의 합으로 나타내는 방법이 n가지인 자연수, n가지의 방법으로 나타낼 수 있는 가장 작은 수.

  1. 진법에 전혀 관계 없이 항상 그대로이다.

ETC

  1. 한국에서 숫자를 기록하거나 말할 때 초, 중, 후 를 나누는 기준
    1. 0~2 - 초반
    2. 3~6 - 중반
    3. 7~9 - 후반

12진법(duodemical)

개요

  1. 10진법처럼 숫자를 기록하는 방식.
  2. 4 이하의 모든 자연수의 최소공배수로 2, 3, 4, 6으로 나눠지므로 등분이 편리.

표현 법

  1. 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

특징

  1. 시간 단위
    1. 시계, 달력, 황도 12궁, 십이지 및 갑오개혁 이전의 시간(자시, 오시) 등에서 볼 수 있듯 시간 쳬계에서 12를 한 단위로 쓰는 경우가 많다.
    2. 각도기 없이 고전적 방법으로 원(태양 주기)를 일정하게 나눌 때 12로 나누는 것이 이상적.

16진법(hexdecimal)

개요

  1. 0~15 범위의 숫자를 통해 숫자를 표현하는 진법.
  2. 컴퓨팅 분야의 숫자 표현 위한 진법 방식.
  3. 2진수의 가독성 향상을 위해 나온 진법 체계.

표현 법

  1. 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
  1. 16진법 ⇒ 2진법 변환
    1. 25FB(16) ⇒ 0010(2)0101(5)1111(F)1011(B) ⇒ 10010111111011(2)
  2. 2진법 ⇒ 16진법 변환
    1. 10111010101010101011110100010(2) ⇒ (000)1 0111 0101 0101 0101 0111 1010 0010 ⇒ 175557A2(16)

ETC

  1. C에서 16진법을 사용할 때는, 숫자 앞에 0x를 붙이는 규칙이 존재.
int hexdecmial = 0x1234;
  1. 컴퓨터에서 16진법을 사용하는 이유는, 자릿수 하나가 2^4를 표현할 수 있기 때문.
  2. 훈련된 상황이면 16진법의 숫자를 보고 바로 2진법 수로 변환이 가능하기 때문에 유용.
  3. 16진수로 표시되는 함수(SHA256)을 쓰는 비트코인과도 밀접한 관계를 갖는다.
  4. 블록 헤더를 구성하는 요소들도 0x가 들어간다.

60진법(sexagesimal)

개요

  1. 60을 한 묶음으로 하여 자릿수를 올려가는 방법.
  2. 시간을 재는데 주로 사용.

ETC

  1. 화씨 온도는 60진법을 기반으로 만들어졌다.
  2. 기하학에서 각도의 단위로 쓰였다.
  3. 인코딩 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);
}