- 자바스크립트로 진수변환 해보기2024년 07월 04일
- Lv. 34 라이츄
- 작성자
- 2024.07.04.:29
그 왜 예전에 백준 진수변환 풀이하면서 했던 '그' 진수변환… 그것도 해볼거긴 한데… 아무튼 할겁니다. 그것도 해볼거니까 진정하시고…
있는거 써보기
일단 자바스크립트에서 진수변환을 하는 방법이 있긴 있다.
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
여기 있으니까 참고하고 오십시오.
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까지)을 곱한 다음 더하면 끝. 위처럼 배열 언패킹을 할 필요가 하~나도 없습니다.
'Coding > JavaScript' 카테고리의 다른 글
색 조합으로 그라데이션을 만들어보자 (0) 2024.08.09 자바스크립트로 16진수 수동변환 해보기 (0) 2024.07.05 자바스크립트로 D-DAY 계산기 만들기 (0) 2024.06.17 색 조합 확인 페이지를 만들어보자 (0) 2024.05.19 모달 윈도우를 만들어보자 (0) 2024.05.12 다음글이전글이전 글이 없습니다.댓글