본문 바로가기
Coding/JavaScript

자바스크립트로 16진수 수동변환 해보기

by Lv. 35 라이츄 2024. 7. 5.

https://koreanraichu.tistory.com/442

 

자바스크립트로 진수변환 해보기

그 왜 예전에 백준 진수변환 풀이하면서 했던 '그' 진수변환… 그것도 해볼거긴 한데… 아무튼 할겁니다. 그것도 해볼거니까 진정하시고…일단 자바스크립트에서 진수변환을 하

koreanraichu.tistory.com

여기서 수동변환은 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문 넣었습니다.

 

오늘의 교훈: 이거 빡세니까 착한 코더 여러분들은 그냥 있는거 쓰세요

최근댓글

최근글

skin by © 2024 ttutta