본문 바로가기
Language/Java

[Java] 진법 / 진법 변환(n진수 변환) /실수 진법변환

by 계범 2022. 2. 25.

10진법과 2진법

우리가 일상생활에서 사용하는 것은 10진법이다.(0~9까지로 표현한 것)

1946년에 개발된 컴퓨터 에니악(ENIAC)은 사람에게 익숙한 10진법이였으나, 전기회로는 불안정하여 전압을 10단계로 나누어 처리하기엔 한계가 있었음.

 

그래서 1950년에 개발된 에드박(EDVAC)은 전기가 흐르면 1, 안 흐르면 0 만으로 동작하도록 설계.

손가락이 10개인 사람에게 10진법이 적합하듯, 컴퓨터와 같은 전기회로에선 0과 1로만 이루어진 2진법이 적합.

 

컴퓨터는 모든 값을 2진수로 바뀌어 저장된다.

int age = 25; // 변수 age에 25 저장

/*
	실제 저장은
    
    변수 age라는 메모리 공간 주소에
    
    25에 해당하는 2진수 11001 이 저장(0은 생략한것)
    
    실제로는 int타입이므로, 32자리
   	00000000000000000000000000011001 이다.
*/

 

2진수 10진수
0 0
1 1
10 2
11 3
100 4
101 5
110 6
111 7
1000 8
1001 9
1010 10

 

2진수에선 2가 없으므로, 10으로 자리올림 발생.

10진수에선 9다음 표현할 숫자가 없으므로, 10으로 자리 올림이 발생.

 

비트(bit)와 바이트(byte)

한 자리의 2진수를 '비트(bit, binary digit)'라고 하며, 1비트는 컴퓨터가 값을 저장할 수 있는 최소 단위.

하지만 비트는 너무 작은 단위이기에, 1비트를 8개 묶은 바이트라는 단위로 정의해서 데이터의 기본단위로 사용.

 

이 외에도 '워드(word'라는 단위가 있는데, 워드는 CPU가 한 번에 처리할 수 있는 데이터의 크기를 뜻함.

워드의 크기는 CPU의 성능에 따라 달라짐.

32비트 CPU에서는 1워드는 32비트이고, 64비트 CPU에선 64비트.

 

n비트로 표현할 수 있는 10진수
값의 개수 : 2^n
값의 범위: 0~2^n-1

 

8진법과 16진법

2진법은 0,1만 표기하기때문에, 값을 표현할때 자리수가 상당히 길어진다는 단점이 존재한다.

이러한 단점 보완을 위해 8진법과 16진법도 많이 사용된다.

 

2진수 8진수 10진수 16진수
0 0 0 0
1 1 1 1
10 2 2 2
11 3 3 3
100 4 4 4
101 5 5 5
110 6 6 6
111 7 7 7
1000 10 8 8
1001 11 9 9
1010 12 10 A
1011 13 11 B
1100 14 12 C
1101 15 13 D
1110 16 14 E
1111 17 15 F
10000 20 16 10

 

정수의 진법 변환

10진수를 n진수로 변환

해당 진수로 나누고 나머지 값을 옆에 적는 것을 더 이상 나눌 수 없을때까지 반복한 다음 마지막 몫과 나머지를 아래부터 위로 순서대로 적으면 된다.

 

 

int num = 14;

//인트형 10진수 문자열 반환
Integer.toString(num , n); // num 숫자 n진수 변환

Integer.toBinaryString(num); // 1110 2진수로 변환
Integer.toOctalString(num); // 16 8진수 변환
Integer.toHexString(num); // e 16진수 변환

//문자형10진수를 인트형 반환
String num = "14";
int n = 8;
Integer.parseInt(num,n); // 12반환


// while문을 통한 10진수의 n진수 변환
public String conventN(int num, int n) {
    String result = "";
    // 0일땐 0 출력
    if (num == 0) {
        return "0";
    }

    // 진법 변환
    while (num > 0) {
        int temp = num % n; // 나머지 구하기

        // 나머지가 9를 넘을땐, 영문자로 변경해줘야해서 +55 (askii코드 참조)
        if (temp > 9) {
            result = (char) (temp + 55) + result;
        } else {
            result = temp + result;
        }
        num /= n; //진법으로 나눠주기
    }
    
    return result;
}

// 만약 정수형태로 반환해야하면, 결과값을 Integer.parseInt()에 감싸주면 된다.

 

n진수를 10진수로 변환

각 자리의 수에 해당 단위의 값을 곱해서 모두 더하면 된다.

 

2진수를 10진수로 변환하면, 아래와 같다.

10110 -> 1 x 2^4 + 0 x 2^3 + 1 x 2^2 + 1 x 2^1  +  0 ^ 2^0

         -> 16 + 0 + 4 + 2 + 0

         -> 22

 

// 문자형 n진수를 10진수 int로 변환
// Integer.valueOf("문자형",n);

Integer.valueOf("1110",2); // 14반환

 

실수의 진법 변환

10진 소수점수를 2진 소수점수로 변환

 

2진 소수점수를 10진 소수점수로 변환

 

참조

'Java의 정석' 책

댓글