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의 정석' 책
'Language > Java' 카테고리의 다른 글
[Java] 실수형의 정밀도, 고정소수점과 부동소수점 (0) | 2022.02.27 |
---|---|
[Java]음수의 2진 표현 - 2의 보수 (0) | 2022.02.27 |
[Java] 형식화 출력 printf() & 입력값 받기 Scanner (0) | 2022.02.25 |
[Java] 기본형(Primitive type) & 상수와 리터럴(constant & literal) (0) | 2022.02.25 |
[Java] 변수(Variable) (0) | 2022.02.25 |
댓글