자바스크립트 진수 변환 함수 만들기

efforthye·2023년 1월 12일

비공개

목록 보기
1/6
post-thumbnail

진수

  • Hex : 16진수 Hexadecimal
    • SHA256 등으로 암호화했을 때 나오는 수
  • Dec : 10진수 Decimal
  • Oct : 8진수 Octal
  • Bin : 2진수 Binary
    • 컴퓨터가 사용하는 수(bit < byte == 8bit)

10진수를 16진수로

function dec2hex(dec) {

    let value = "";
    while (dec) {
        // 10진수를 16으로 나눠서 그 나머지를 사용한다.
        // 0~15까지 사용한다. 0~9까지는 그대로 사용한다.
        // 10~15 : 한 자리로 나타내야 하기 때문에 영어의 A~F
        switch (dec % 16) {

            // 나머지가 10~15일 경우 해당 영문으로 변환
            case 10:
                value = "A" + value;
                break;
            case 11:
                value = "B" + value;
                break;
            case 12:
                value = "C" + value;
                break;
            case 13:
                value = "D" + value;
                break;
            case 14:
                value = "E" + value;
                break;
            case 15:
                value = "F" + value;
                break;

            // 0~9까지는 default로 처리한다.
            default:
                value = (dec % 16) + value; //앞자리에 나머지를 추가
                break;
        }

        // 나누면 소수점으로 나타내므로 소수점을 버린다. Math.floor() 대신 parseInt()를 사용해도 된다.
        dec = Math.floor(dec/16);

    }

    return value;
}

console.log(dec2hex(23489));

16진수를 10진수로

// 보통 프로그래밍 상에서 Hex, 즉 16진수는 string(문자열, 문장)으로 정의된다.
// 16진수를 10진수로
function hex2dec(hex) {
    // 10진수를 저장할 변수
    let value = 0;
    for (let i = 0; i < hex.length; ++i) {
        let temp = 0;
        switch (hex[i]) {
            case "A":
                temp = 10;
                break;
            case "B":
                temp = 11;
                break;
            case "C":
                temp = 12;
                break;
            case "D":
                temp = 13;
                break;
            case "E":
                temp = 14;
                break;
            case "F":
                temp = 15;
                break;
            // default : hex의 i번째를 숫자로 바꾼 것
            default:
                temp = +hex[i];
                break;
        }

        // 더해줘야 한다. 
        // 만약 123이면 첫 자리를 계산할 때 temp는 1이고
        // 100의 자리면 16**2를 해줘야 하는데 2를 어떻게 구할 것인가?
        // i <= 1
        // hex.length - i 는 3이니까 1을 더 빼준다.
        // **은 제곱이다.
        value += temp * (16 ** (hex.length - i - 1));

        // value += temp * pow(16, hex.length - i - 1); -> 우리가 만든pow() 함수
        // hex == '123'

        // i == 0 이면/ hex[i] == '1' 임/ 1은 100의자리수이기 때문에 16의 제곱이다.
        // 10진수 바꿀 때 1에 16의 제곱을 곱해서 더해야한다.
        // i == 1 / hex[i] == '2' / 2는 10의 자리 수이기 때문에 16의 1승이다.
        // i == 1 / hex[i] == '3' / 3은 1의 자리 수이기 때문에 16의 0승이다.

        // 각 자리수에 대해서 16의 n승 곱해야 한다. 
        // 그 n은 각 자리수가 바뀔 때 함께 바뀌는 것은 i이니까 i를 이용하여 n을 구한다.
        // i가 증가할 때마다 n은 감소한다.
        // 그 기준은 hex.length - 1 이다.

        // hex를 기준으로 0의 자리부터 16제곱을 생각하면 0, 1, 2, 3, 4, 5,  ... 식으로 된다.
        //  4        5       6        8
        // 16의3승 16의2승 16의1승 16의0승(제곱)
    }

    return value;

}

2진수를 10진수로

function bin2dec(bin){
    let value = 0;
    for(let i = 0; i<bin.length; ++i){
        value += +bin[i] * 2 ** (bin.length - 1 -i);
    }
    return value;
}

10진수를 2진수로

function dec2bin(dec){
    let value = "";
    while(dec){
        value = (dec%2) + value;
        dec = parseInt(dec/2);
    }
    return value;
}

콘솔로 확인

console.log(dec2hex(4123)); // 101B
console.log(hex2dec(dec2hex(4123))); // 4123
console.log(dec2bin(4123)); // 1000000011011
console.log(bin2dec(dec2bin(4123))); // 4123
  • 결과

프로그래머 계산기

  • 우리의 결과값과 같게 나오는지 Hex, Bin 확인

0개의 댓글