진법(base)

밤비나·2023년 3월 14일

기초수학 w/python

목록 보기
4/14

진법(Base)

진법은 숫자를 나타내는 방법 중 하나로, 어떤 값을 표현하기 위해 사용되는 기호의 체계를 말한다.

우리가 흔히 쓰는 10진법(Decimal System)은 0부터 9까지 10개의 기호를 사용하여 숫자를 나타낸다. 이외에도, 2진법(Binary System), 8진법(Octal System), 16진법(Hexadecimal System) 등이 있다. 각 진법은 기호 체계와 그에 따른 계산 방식이 다르며, 주로 컴퓨터 과학, 디지털 시스템, 수학 등에서 사용된다.

2진법(Binary System)

2진법은 0과 1 두 개의 기호를 사용하여 숫자를 나타낸다. 2진법에서는 각 자리가 2의 제곱수로 증가한다. 예를 들어, 2진법에서 1011은 다음과 같이 10진법으로 변환할 수 있다.

123+022+121+120=8+0+2+1=111\cdot2^3 + 0\cdot2^2 + 1\cdot2^1 + 1\cdot2^0 = 8 + 0 + 2 + 1 = 11

2진법은 컴퓨터에서 가장 기본적인 진법이며, 디지털 신호를 처리하는 데에도 사용된다.

8진법(Octal System)

8진법은 0부터 7까지 8개의 기호를 사용하여 숫자를 나타낸다. 8진법에서는 각 자리가 8의 제곱수로 증가한다. 예를 들어, 8진법에서 527은 다음과 같이 10진법으로 변환할 수 있다.

5×82+2×81+7×80=320+16+7=3435\times8^2+2\times8^1+7\times8^0 = 320+16+7 = 343

8진법은 주로 UNIX 시스템에서 사용된다.

16진법(Hexadecimal System)

16진법은 0부터 9까지 10개의 기호와 A부터 F까지 6개의 알파벳을 사용하여 숫자를 나타낸다. 16진법에서는 각 자리가 16의 제곱수로 증가한다. 예를 들어, 16진법에서 A3F는 다음과 같이 10진법으로 변환할 수 있다.

10×162+3×161+15×160=2560+48+15=262310\times 16^2 + 3\times 16^1 + 15\times 16^0 = 2560 + 48 + 15 = 2623

16진법은 컴퓨터에서 메모리 주소를 표현하는 데에도 사용된다.


파이썬에서의 진법

컴퓨터에서는 메모리 주소를 16진법으로 표현한다. 메모리 주소는 컴퓨터에서 데이터를 저장하고 접근하기 위해 필요한 정보이며, 16진법을 사용함으로써 메모리 주소를 간단하게 표현할 수 있다.

또한, 컴퓨터에서 색상을 표현하는 데에도 16진법을 사용한다. HTML, CSS 등의 웹 개발에서는 색상 코드를 16진법으로 표현하며, 각각의 16진수 값은 빨강, 초록, 파랑 색상 값의 강도를 나타낸다.

파이썬에서는 16진법을 표현할 때 숫자 앞에 0x를 붙인다. 예를 들어, 0x1A는 16진수로 1*16+10=26을 의미한다. 파이썬에서는 16진수를 10진수로 변환하는 int() 함수를 제공한다.

hex_num = "1A"
dec_num = int(hex_num, 16)
print(dec_num)  # 26 출력
# 반대로 10진수를 16진수로 변환하는 방법
dec_num = 26
hex_num = hex(dec_num)
print(hex_num)  # '0x1a' 출력

10진수 -> X진수 변환, X진수 -> 10진수 변환, X진수 -> X진수 변환하는 프로그램

# 10진수를 X진수로 변환하는 함수
def decimal_to_base(decimal, base):
    result = ""
    while decimal > 0:
        remainder = decimal % base
        if remainder < 10:
            result = str(remainder) + result
        else:
            result = chr(remainder + 55) + result
        decimal //= base
    return result if result else "0"

# X진수를 10진수로 변환하는 함수
def base_to_decimal(base_num, base):
    decimal = 0
    for i in range(len(base_num)):
        if ord(base_num[i]) >= 65:
            decimal += (ord(base_num[i]) - 55) * (base ** (len(base_num)-i-1))
        else:
            decimal += int(base_num[i]) * (base ** (len(base_num)-i-1))
    return decimal

# X진수를 Y진수로 변환하는 함수
def base_to_base(base_num, from_base, to_base):
    decimal = base_to_decimal(base_num, from_base)
    return decimal_to_base(decimal, to_base)
    
    
# 10진수를 2진수로 변환
print(decimal_to_base(15, 2)) # 출력: 1111

# 2진수를 10진수로 변환
print(base_to_decimal("1111", 2)) # 출력: 15

# 16진수를 10진수로 변환
print(base_to_decimal("FF", 16)) # 출력: 255

# 16진수를 2진수로 변환
print(base_to_base("FF", 16, 2)) # 출력: 11111111
profile
씨앗 데이터 분석가.

0개의 댓글