- 자바스크립트로 16진수 수동변환 해보기2024년 07월 05일
- Lv. 34 라이츄
- 작성자
- 2024.07.05.:00
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 다음글이전글이전 글이 없습니다.댓글