https://koreanraichu.tistory.com/442
여기서 수동변환은 10->2랑 2->10만 해봤는데... 사실 세상은 넓고 진수는 많습니다. 그 중에는 10보다 큰 수가 기본인 진수가 있는데 일단 12진수(시간) 16진수(...) 60진수 이런 게 있다. 그러면 얘네들은 10부터 어떻게 처리하냐고? 16진수와 12진수의 경우 해당하는 알파벳이 있다. 그럼 어떻게 하나요? 아 그걸 지금부터 해볼거다.
10진수->16진수
a = int(input())
hex_list = []
while a >= 1:
if a % 16 == 10: # 16진수에서 10~15까지는 각각 A~F로 표기한다. 즉, 여기에 대한 처리를 따로 진행해야 한다.
hex_list.append("A")
elif a % 16 == 11:
hex_list.append("B")
elif a % 16 == 12:
hex_list.append("C")
elif a % 16 == 13:
hex_list.append("D")
elif a % 16 == 14:
hex_list.append("E")
elif a % 16 == 15:
hex_list.append("F")
else:
hex_list.append(a % 16)
a = int(a / 16)
hex = hex_list[::-1]
hex=''.join(map(str,hex))
print(hex)
일단 기본 골자가 되는 Python 코드를 보니 if문이 줄줄이 달려있다. 왜냐하면 16진수에서 10, 11, 12, 13, 14, 15를 A, B, C, D, E, F로 표기하기때문에 16으로 나눴을 때 나머지가 10 이상이면 해당하는 알파벳으로 바꿔줘야 하기 때문이다.
dectohex.addEventListener('click',(e)=>{
let decInt = parseInt(dec.value,10)
while (decInt >= 1) {
hex_list.push(decInt % 16);
decInt = Math.floor(decInt / 16)
};
hex_list = hex_list.reverse()
hex.innerText = hex_list.join('')
});
전에 그 2진수로 바꿨던 코드를 가져와보자. 그러면 이렇게 되는데… 아… 문제가 하나 있습니다. 저거 그냥 저렇게 하면 255가 FF가 아니라 1515가 된다.
dectohex.addEventListener('click',(e)=>{
let decInt = parseInt(dec.value,10)
while (decInt >= 1) {
if (Math.floor(decInt % 16) == 10) {
hex_list.push('A');
}
else if (Math.floor(decInt % 16) == 11) {
hex_list.push('B');
}
else if (Math.floor(decInt % 16) == 12) {
hex_list.push('C');
}
else if (Math.floor(decInt % 16) == 13) {
hex_list.push('D');
}
else if (Math.floor(decInt % 16) == 14) {
hex_list.push('E');
}
else if (Math.floor(decInt % 16) == 15) {
hex_list.push('F');
}
else {
hex_list.push(decInt % 16);
}
decInt = Math.floor(decInt / 16)
};
hex_list = hex_list.reverse()
hex.innerText = hex_list.join('')
});
그래서 나머지에 조건문이 들어간다. 나머지가 10이면 A, 11이면 B, 12면 C 이런 식으로 알파벳을 하나씩 할당해주면 변환 끝!
16진수->10진수
a = input()
cipher = len(a) # 자릿수가 영어로 cipher였다니
a = a[::-1]
dec_number = 0
Hex_letter = ['A','B','C','D','E','F']
Hex_number = [10,11,12,13,14,15]
for i in range(cipher):
try:
dec_number += int(a[i]) * (16 ** i)
except:
dec_number += Hex_number[Hex_letter.index(a[i])] * (16 ** i)
print(dec_number)
아, Python은 예외처리 때렸다. 왜 예외처리가 들어갔냐면 알파벳은 연산이 안되거든… 예외처리는 대충 뭔 말이냐면 곱하라는게 문자면 위에 글자 인덱스로 밑에 숫자 리스트에서 찾아서 곱하쇼 이런 얘기. …아놔 이거 빡세지겠는데?
hextodec.addEventListener('click',()=>{
let hexReverse = hex.value.split("").reverse().join("");
for (let i = 0;i < hexReverse.length;i++) {
dec_number += parseInt(hexReverse[i]) * (16 ** i)
}
dec.innerText = dec_number
});
그러니까 그냥 이렇게 하면 컴퓨터가 미쳤습니까 휴먼? 하는건데… 나 자바스크립트는 예외처리 할 줄 모름둥…
hextodec.addEventListener('click',()=>{
let hexReverse = hex.value.split("").reverse().join("");
for (let i = 0;i < hexReverse.length;i++) {
if (hexReverse[i] == 'A' || hexReverse[i] == 'a') {
dec_number += 10 * (16 ** i)
}
else if (hexReverse[i] == 'B' || hexReverse[i] == 'b') {
dec_number += 11 * (16 ** i)
}
else if (hexReverse[i] == 'C' || hexReverse[i] == 'c') {
dec_number += 12 * (16 ** i)
}
else if (hexReverse[i] == 'D' || hexReverse[i] == 'd') {
dec_number += 13 * (16 ** i)
}
else if (hexReverse[i] == 'E' || hexReverse[i] == 'e') {
dec_number += 14 * (16 ** i)
}
else if (hexReverse[i] == 'F' || hexReverse[i] == 'f') {
dec_number += 12 * (16 ** i)
}
else {
dec_number += parseInt(hexReverse[i]) * (16 ** i)
}
};
dec.innerText = dec_number
});
일단 왜 이렇게 된거냐… 자바스크립트에도 예외처리가 있습니다. 있는데 문자열이 들어가면 미쳤습니까 휴먼? 을 하는 게 아니라 결과가 NaN이 되버림… 그래서 걍 if문 넣었습니다.
오늘의 교훈: 이거 빡세니까 착한 코더 여러분들은 그냥 있는거 쓰세요
'Coding > JavaScript' 카테고리의 다른 글
자바스크립트로 달력을 만들어보자. (feat. 음력 달력) (0) | 2024.09.05 |
---|---|
색 조합으로 그라데이션을 만들어보자 (0) | 2024.08.09 |
자바스크립트로 진수변환 해보기 (0) | 2024.07.04 |
자바스크립트로 D-DAY 계산기 만들기 (0) | 2024.06.17 |
색 조합 확인 페이지를 만들어보자 (0) | 2024.05.19 |