컴퓨터는 이진수 밖에 모른다.
컴퓨터에게 "진수"란 "전압의 단계"를 의미한다.
컴퓨터에게 가장 적합한 진수는 "2진수"이며, 1 = 전기가 흐름이고 0 = 전기가 흐르지 않음 이다.
변수는 값을 할당하기위해 메모리공간에 이름을 지은 것이다. 우리가 값을 할당할 때에 10진수로 표현해서 값을 저장하지만, 컴퓨터는 “2진수 밖에 모르기 때문에” 10진수를 다시 2진수로 변환해서 변수에 저장한다.
10진법과 2진법
일상생활에서 가장 많이 사용하는 진법은 10진법으로 0~9 , 즉 10개의 수를 표현할 수 있다.
9 보다 큰, 즉 10진수가 표현하지 못하는 수로 넘어가면, "올림"이 발생한다.
모든 진법에서 표현하는 수 이상을 넘어가게 되면 "올림"이 발생한다. 2 진법은 0-1 , 즉 2개의 수를 표현할 수 있으므로 1 보다 높은 수는 "올림"으로 표현한다.
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 |