파이썬으로 10진법에서 2진법 16진법 으로 변경하기
먼저 알고리즘은 다음과 같다.
입력으로 10진수를 받고, 이 10진수를 2로 계속 나누어서, 몫이 1이 될 때 까지 모듈러 2 연산의 나머지 값을 활용한다.
모듈러 2 연산을 할 때 결과는 0 또는 1인데, 이 결과 값을 2진수의 최하의 비트 부터 채워주는 것이다.
예를 들어
200을 2진수로 변경 할 때,
200%2 = 0 이고 몫은 100이 된다.
그럼 2의 0에 해당 하는 최하위 비트는 0 이된다.
그 다음으로
100%2를 수행하고, 이 때 값은 0이 되고 몫은 50이 된다.
그러면 2진수로 바꾸엇을 때의 비트는 00이 된다.
다시 수행하면
50%2의 값은 0이 되고 몫은 25가 된다.
그러면 하위 비트 부터 최상위 비트 까지는 000이 된다.
25%2의 값은 1이 되고, 몫은 12가 된다.
그러면 비트는 1000이 된다.
12%2의 값은 0이 되고, 몫은 6이 된다.
그러면 비트는 01000이 된다.
6%2의 값은 0이 되고, 몫은 3이 된다.
그러면 비트는 001000이 된다.
3%2의 값은 1이고, 몫은 1이 된다.
그러면 비트는 1001000이된다.
마지막으로 최상위 비트에 1을 추가해 준다. 그러면
200이라는 십진수는 11001000(2)가 된다.
이걸 파이썬으로 구현하면 다음과 같다.
def binary(a):
hex = {'0000':'0','0001':'1','0010':'2','0011':'3',
'0100': '4','0101': '5', '0110': '6', '0111':'7',
'1000': '8', '1001':'9', '1010':'A', '1011':'B',
'1100': 'C', '1101':'D','1110':'E', '1111':'F'}
print(hex)
l= list()
l_h = list()
s1= ""
s2= ""
while(a != 0):
r=a%2
l.append(r)
a = a//2
l.reverse()
print(l)
s1 = list_to_string(l)
print(s1)
print(l)
for i in range(0,len(l),4):
print(i)
l_h.append(hex[s1[i:i+4]])
print(l_h)
s2 = list_to_string(l_h)
print(s2)
def list_to_string(list):
s=""
for i in range(len(list)):
s += str(list[i])
return s
그 다음 함수로 바꿔줄 부분을 바꿔주면 다음과 같다.
def binary(a):
hex = {'0000':'0','0001':'1','0010':'2','0011':'3',
'0100': '4','0101': '5', '0110': '6', '0111':'7',
'1000': '8', '1001':'9', '1010':'A', '1011':'B',
'1100': 'C', '1101':'D','1110':'E', '1111':'F'}
print(hex)
l= list()
l_h = list()
s1= ""
s2= ""
while(a != 0):
r=a%2
l.append(r)
a = a//2
l.reverse()
s1 = list_to_string(l)
print_binary(s1)
l_h = hex_slice(l,l_h,s1,hex)
s2 = list_to_string(l_h)
print_hex(s2)
def list_to_string(list):
s=""
for i in range(len(list)):
s += str(list[i])
return s
def hex_slice(list1,list2,string,dict):
for i in range(0,len(list1),4):
list2.append(dict[string[i:i+4]])
return list2
def print_binary(string):
print(string+"(2)")
def print_hex(string):
print("0x"+string)