Java

5. 진수

Jungsoomin :) 2021. 8. 13. 01:06
--- ---

컴퓨터는 이진수 밖에 모른다.


컴퓨터에게 "진수"란 "전압의 단계"를 의미한다.

컴퓨터에게 가장 적합한 진수는 "2진수"이며, 1 = 전기가 흐름이고 0 = 전기가 흐르지 않음 이다.

변수는 값을 할당하기위해 메모리공간에 이름을 지은 것이다. 우리가 값을 할당할 때에 10진수로 표현해서 값을 저장하지만, 컴퓨터는 “2진수 밖에 모르기 때문에” 10진수를 다시 2진수로 변환해서 변수에 저장한다.
%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202021-08-12%20%EC%98%A4%ED%9B%84%2010 40 25



10진법과 2진법


일상생활에서 가장 많이 사용하는 진법은 10진법으로 0~9 , 즉 10개의 수를 표현할 수 있다.

9 보다 큰, 즉 10진수가 표현하지 못하는 수로 넘어가면, "올림"이 발생한다.

%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202021-08-12%20%EC%98%A4%ED%9B%84%2010 29 13

모든 진법에서 표현하는 수 이상을 넘어가게 되면 "올림"이 발생한다. 2 진법은 0-1 , 즉 2개의 수를 표현할 수 있으므로 1 보다 높은 수는 "올림"으로 표현한다.

%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202021-08-12%20%EC%98%A4%ED%9B%84%2010 34 16


bit 와 byte


1 자리의 2진수 를 bit 라고하며, “1bit 는 컴퓨터가 값을 저장할 수 있는 최소단위” 이다.

8bit [2진수 8자리] 를 묶어 “1byte 라고 하며, 1byte는 데이터의 기본단위” 이다.

Word”(워드)는 CPU 가 한 번에 처리할 수 있는 데이터의 크기를 의미한다.

Word 는 CPU 에 따라 다르며 32bit CPU 는 bit 32(4byte) 를 한 번에 처리할 수 있으며, 64bit CPU 는 64bit(8byte) 를 한 번에 처리할 수 있다.

하나의 바이트가 표현할 수 있는 값의 수는 2의 8승[8자리의 이진수] → 표현할 수 있는 가짓수를 곱한 것, 2_2_2_2_2_2_2*2

이를 일반화 시키면 n 비트로 2의 n 승 만큼의 값을 표현할 수 있는 것이다.

  • n 비트로 표현할 수 있는 10 진수의 범위는 0 ~ 2의 n승 -1 까지 이다.
  • n 비트로 표현할 수 있는 값의 개수는 2의 n승 개이다.


8진법, 16진법


2진법으로도 10진수를 표현할 수 있으나, 표현할 수 있는 수의 한계 때문에 올림현상이 일어나 자릿수가 점점 더 많아진다. 이런 단점을 보완하기 위해서 8진법과 16진법을 사용한다.

8진법은 0~7, 16 진법은 0~F(15)까지의 값을 표현할 수 있으며, 더 큰 수는 올림처리 된다.

2진법은 2가지, 8진법은 8가지, 16진법은 16가지의 수를 표현하는데, 이렇게 계산하면…

  • 2진법 2의 1승 가지의 수
  • 8진법 2의 3승 가지의 수
  • 16진법 2의 4승 가지의 수

대체할 수 있는 자릿 수를 파악해보면 이러하다.

  • 8진법 2진수 3자리의 수를 대신한다.
  • 16진법 2진수 4자리의 수를 대신한다.


2진수를 8진수 16진수로 변환


서론에 설명했던 것 처럼, 2진수 3자리를 8진수 1자리가 대신할 수 있고, 2진수 4자리를 16진수 1자리가 대신할 수 있다.

변환 방법은 이진수를 대신할 수 있는 자릿수만큼 뒤에서부터 끊어서 해당 진수로 변환하는 것이다.

1010101100 > 512+128+32+8+4 > 684 // [ 10진수 ]
1010101100 > 1_010_101_100 > 1_2_5_4 > 1254 // [ 8진수 ]
1010101100 > 10_1010_1100 > 2_A_C > 2AC // [ 16진수 ]



10 진수를 n 진수로 변환


나눌 수 없을 때까지 진수 값으로 나눈 후, 몫 부터 나머지까지 순서대로 적어주면 된다.

public static void main(String[] args) {
        int num = 46;
        StringBuffer sb = new StringBuffer("");
        int n = 2;

        while (num >= n) {
            sb.append(num%n);
            num /= n;
        }
        sb.append(num);
        String result = sb.reverse().toString();

        System.out.println(result); // 101110
    }




n 진수를 10 진수로 변환


  • 각 자리의 수에 해당 진수의 수^단위 만큼 곱해서 더하면 된다.
public static void main(String[] args) {
    String arg = Integer.toBinaryString(46);
    int n = 2;//진수
		int result = 0;

    String[] strNum = arg.split("");

    result = strNum[strNum.length-1].equals("0") ?
								 0 : Integer.parseInt(strNum[strNum.length-1]);

    for(int i = 1; i < strNum.length; i++) {
        Integer number = Integer.valueOf(strNum[strNum.length - (i+1)]);
        int unit = 1;

        for(int j = 0; j < i; j++){
            unit *= n;
        }

        result += number * unit;
    }

    System.out.println("10 진수 변환 : "+result);
}

'Java' 카테고리의 다른 글

5. printf()  (0) 2021.08.13
4. 상수와 리터럴  (0) 2021.08.13
3. 변수의 타입  (0) 2021.08.12
2. 변수  (0) 2021.08.12
1. 주석  (0) 2021.08.10