1. 옥탈 인코딩

인코딩에 대해 말하자면... 아시다시피, 일상 생활에서 우리는 십진수 표기법을 사용합니다. 모든 숫자는 10개의 기호(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)를 사용하여 표시됩니다. 숫자이므로 시스템을 십진법이라고 합니다.

그러나 프로그래머는 대단한 발명가입니다. 그들은 다른 수의 기호를 사용하는 인코딩을 즉시 생각해 냈습니다. 예를 들어 16, 8 및 2입니다.

8개의 기호를 사용하는 대체 인코딩이 가장 쉽습니다. 8과 9를 삭제하면 8진수 인코딩( 8진수 체계 )이 됩니다.

그리고 예, 8진수 시스템을 사용하여 숫자 리터럴을 지정할 수 있습니다. 물론 정말로 필요한 경우. 생각보다 쉽습니다. 숫자 앞에 숫자 0을 쓰면 됩니다.

즉, Java는 0으로 시작하는 모든 정수 리터럴을 8진수 값으로 취급합니다.

예:

암호 노트
int x = 015;
x는 13: 1*8+5
int x = 025;
x는 21: 2*8+5
int x = 0123;
x는 83입니다: 1*64+2*8+3 == 1*8 2 +2*8 1 +3*8 0
int x = 078;
이것은 컴파일되지 않습니다: 8은 8진수 인코딩에 사용되는 기호 중 하나가 아닙니다.

코드에 8진수를 작성할 필요는 거의 없지만 그것이 무엇인지 알아야 합니다. 결국 다른 사람이 작성한 코드를 읽어야 합니다. 위에서 언급했듯이 프로그래머는 큰 발명가입니다.

음, 모든 숫자 앞에 단순히 0을 쓸 수는 없다는 것을 기억하세요.



2. 바이너리 인코딩

이진 인코딩은 훨씬 더 흥미롭습니다. 8진수에 숫자 0-7만 있는 경우 이진수에는 0과 1만 있습니다. 이 인코딩이 필요한 이유는 무엇입니까?

이것은 컴퓨터의 내부 구조와 모든 관련이 있습니다. 컴퓨터의 모든 것은 전기로 작동하며, 공교롭게도 전기를 사용하여 무언가를 저장하고 전송하는 가장 효율적인 방법은 전선에 전기가 없거나(0) 전기가 있는(1) 두 가지 상태를 사용하는 것입니다.

이것이 이진수 체계의 인기의 기원입니다.

원칙적으로 Java에서는 자주 사용되지 않습니다. Java는 실행되는 하드웨어에서 완전히 추상화된 고급 언어로 간주됩니다. 실제로 컴퓨터 내부에서 데이터를 저장하고 처리하는 데 어떤 형식이 사용되는지 정말로 관심이 있습니까?

그러나 지난 수십 년 동안 프로그래머들은 이진 인코딩(및 이를 기반으로 하는 다른 인코딩)을 좋아하게 되었습니다. 결과적으로 Java에는 이진수를 입력으로 사용하는 연산자가 있습니다. 그리고 부동 소수점 숫자의 정확도는 이진 표현에 따라 다릅니다.

기본적으로 이 인코딩에 대해 모르는 것보다 아는 것이 좋습니다.

그리고 8진수 인코딩의 경우와 마찬가지로 Java에는 2진법을 사용하여 리터럴을 인코딩하는 방법이 있습니다. 즉, 리터럴은 0과 1로만 구성됩니다. Java 컴파일러가 코드에 단순히 0과 1로 구성된 십진수가 아닌 이진수로 인코딩된 숫자 리터럴이 포함되어 있음을 이해 하기 위해 모든 이진 리터럴은 접두사 0b 를 사용하여 식별됩니다('b'는 이진수라는 단어에서 유래) . .

예:

암호 노트
int x = 0b100;
х는 4: 1*4+0*2+0
int x = 0b1111;
х는 15: 1*8+1*4+1*2+1
int x = 0b1111000111;
х는 967이다: 1*2 9 +1*2 8 +1*2 7 +1*2 6 +0*2 5 +0*2 4 +0*2 3 + 1*2 2 + 1*2+1;
int x = 0b12000;
이것은 컴파일되지 않습니다: 2는 이진 인코딩에 사용되는 기호 중 하나가 아닙니다.


3. 16진수 인코딩

8진수 및 2진수 인코딩 외에도 리터럴은 16진수로도 작성할 수 있습니다. 이것은 매우 인기있는 인코딩입니다.

이진 표기법은 숫자가 실제로 저장되는 방식에 최대한 가깝지만 사람이 이러한 숫자를 효과적으로 사용하기가 너무 어렵기 때문입니다. 이진법에서 백만이라는 숫자는 7이 아닌 20자리를 포함합니다.

이것이 프로그래머들이 16진법을 고안한 이유입니다. 결국 16은 2의 4 제곱이므로 정확히 4비트는 16진수 숫자 하나에 해당합니다. 대략적으로 말하면 이제 모든 4비트를 하나의 16진수로 쓸 수 있습니다.

16진수 인코딩에는 고유한 접두사인 0x 도 있습니다 . 예:

십진수 이진 표기법 16진법
17 0b 0001 0001 0x11 _ _
4 1 0b 0010 1 00 1 0x 2 9
85 0b 0101 0101 0x 5 5
256 0b 1 0000 0000 0x100 _ _ _

좋아, 당신은 우리가 어떻게 8진수 시스템을 얻었는지 충분히 분명하다고 말할 수 있다: 우리는 숫자 8과 9를 버렸습니다. 하지만 16진수 시스템을 위한 6개의 추가 기호는 어디서 얻습니까? 나는 그들을 보고 싶다!

모두 간단합니다. 영어 알파벳의 처음 6글자는 A (10), B (11), C (12), D (13), E (14), F (15)의 누락된 기호 6개로 간주되었습니다.

예:

16진법 이진 표기법 십진수
0x1 _ 0b 0000 0001 1
0x9 _ 0b 0000 1001 9
0x A 0b 0000 1010 10
0xB _ 0b 0000 1011 11
0x C 0b 0000 1100 12
0x D 0b 0000 1101 13
0x E 0b 0000 1110 14
0x 에프 0b 0000 1111 15
0x 1 에프 0b 0001 1111 31
0x AF _ 0b 1010 1111 175
0x 에프 _ 0b 1111 1111 255
0x 에프 에프 _ 0b 1111 1111 1111 4095


4. 숫자를 16진수로 변환하는 방법

숫자를 16진수에서 10진수로 변환하는 것은 매우 쉽습니다. 숫자 0 x A F C F 가 있다고 가정해 보겠습니다 . 십진수로 얼마인가요?

첫째, 위치 번호 체계가 있습니다. 즉, 오른쪽에서 왼쪽으로 이동할 때 전체 숫자에 대한 각 숫자의 기여도가 16배 증가합니다.

A * 16 3 + F * 16 2 + C * 16 1 + F

기호 A는 숫자 10에 해당하고 문자 C는 숫자 12에 해당하며 문자 F는 15를 나타냅니다. 우리는 다음을 얻습니다.

10 * 16 3 + 15 * 16 2 + 12 * 16 1 + 15

숫자에 해당하는 다양한 거듭제곱으로 16을 올리면 다음을 얻습니다.

10 * 4096 + 15 * 256 + 12 * 16 + 15

우리는 모든 것을 요약하고 다음을 얻습니다.

45007

이 숫자가 메모리에 어떻게 저장되는지 알고 있습니다.

0x A F C F

하지만 이제 이진수로 변환해 보겠습니다. 바이너리에서는 다음과 같습니다.

0b 1010 1111 1100 1111

4비트의 모든 세트는 정확히 하나의 16진수 문자에 해당합니다. 매우 편리합니다. 곱셈이나 거듭제곱 없이."