본문 바로가기
Coding/JavaScript

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

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

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


있는거 써보기

일단 자바스크립트에서 진수변환을 하는 방법이 있긴 있다.

numBtn.addEventListener('click',()=>{
  let binary = document.createElement('p');
  binary.innerText = parseInt(numberInput.value,10).toString(2)
  numResult.appendChild(binary)
});

일단 쟤가 왜 저렇게 된 건지를 보자... 단순히 숫자로 입력받아서 변환하는 경우에는

let number = 1024;
console.log(number.toString(2));

이렇게 toString만 해 줘도 된다. 아니 그럼 쟤는 왜 저렇게 길어진건데요? input으로 입력받는거라 문자열이기 때문이다. 그래서 정말 본의아니게도 여기에 N진수를 10진수로 변환하는 방법까지 들어가 있는 것.

 

let number = FF;
console.log(parseInt(number, 10))

이렇게 걍 parseInt(n진수, 10) 하면 10진수로 바꿀 수 있다. 2–8–16 상호전환이고 입력이 2진수면 parseInt(2진수, 16) 이런 식으로 해주면 된다.

 

See the Pen Untitled by koreanraichu (@koreanraichu) on CodePen.

위 코드는 여기서도 볼 수 있다. 근데… 우리 이게 본론이 아니잖아요?

 

10진수->2진수

그 왜 예전에 백준 문제 풀이하면서 10진수를 n진수로 변환하는 방법이랑 n진수를 10진수로 변환하는 방법인데 인제 그 '수기로' 하는 방법을 코딩했었다. 그니까 그 n으로 나눠서 나머지 어쩌고 하는 그 방법 말하는거 맞다.

 

일단 파이썬에서 짰던 코드가 어떻게 돌아가는지 알아보자.

a = int(input())
oct_list = []
while a >= 1:
    oct_list.append(a % 8)
    a = int(a / 8)
oct = oct_list[::-1]
oct=''.join(map(str,oct))
print(oct)

2진수는 코드에 1의보수 2의보수 같이 들어있어서 부득이하게 8진수 들고 왔는데 기본 골자는 같다. 10진수인 수를 진수변환 할 수로 나눈 다음 나머지 빼고 또 나누고 나누고... 이런 과정의 반복인데 혹시 이해가 안 가신다면

https://koreanraichu.tistory.com/254

 

백준 2745번 풀이

문제 https://www.acmicpc.net/problem/2745 2745번: 진법 변환 B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오. 10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있

koreanraichu.tistory.com

여기 있으니까 참고하고 오십시오.

 

dectobin.addEventListener('click',(e)=>{
  let decInt = parseInt(dec.value,10)
  while (decInt >= 1) {
    bin_list.push(decInt % 2);
    decInt = Math.floor(decInt / 2)
  };
  bin_list = bin_list.reverse()
  console.log(bin_list)
  // 아 자바스크립트도 while문이 있구나... 아... 
});

일단 정말 놀라운 사실을 하나 알려드리자면, 자바스크립트에도 While문이 있다. 아니, 진짜로 있다. 그래서 저거 while문으로 짠거고, python에서 짰던거랑 같은 로직으로 나머지를 배열에 넣고 그 배열을 뒤집었는데… 이렇게 출력하면 어떻게 되냐…

 

[1,1,0,1]

뭐야 숫자로 줘요… 쟤는 배열이지 숫자가 아니다. 그리고 우리는 숫자로 출력할거라서 저 배열을 최종적으로 문자열로 만들어야 한다.

 

bin.innerText = bin_list.join('')

올? 얘도 join이 있네?

 

이거 응용하면 3진수 9진수 이런것도 가능하다. 대신 11 이상이면 A부터 시작해서 해당하는 알파벳을 쭉 배정해야 한다. 16진수의 경우 ABCDEF 여섯개. 그럼 여기서 끝… 이 아니고… 이번에는 2진수를 10진수로 바꿔보자.

 

2진수->10진수

a = input()
cipher = len(a) # 자릿수가 영어로 cipher였다니
a = a[::-1]
dec_number = 0

for i in range(cipher):
    dec_number += int(a[i]) * (2 ** i)

print(dec_number)

이건 위에껏보다 더 쉽다.

 

bintodec.addEventListener('click',()=>{
  let binReverse = bin.value.split("").reverse().join("");
  for (let i = 0;i < binReverse.length;i++) {
    dec_number += parseInt(binReverse[i]) * (2 ** i)
  }
  dex.innerText = dec_number
});

입력한 숫자를 뒤집어서 앞에것부터 순차적으로 2의 i승(예시의 경우 0, 1, 2, 3까지)을 곱한 다음 더하면 끝. 위처럼 배열 언패킹을 할 필요가 하~나도 없습니다.

최근댓글

최근글

skin by © 2024 ttutta