"효과적인 코딩보다 더 좋은 것은 없습니다, 아미고! 오래된 로봇을 믿으세요."

"스파이가 사용하는 암호를 말하는 겁니까?"

"당연하지. 나는 소화 가능한 형태로 정보를 제시하는 것에 대해 이야기하고 있는 것이다. 기수 체계에 대해. 일상 생활에서 대부분의 사람들이 십진법을 사용한다는 것을 알고 있다. 십진법은 모든 숫자를 나타내는 10개의 기호를 사용한다: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. 숫자가 10개이므로 십진법이라고 합니다."

"그것은 열 손가락을 가진 인간에게 편리했습니다. 하지만 프로그래머는 대단한 발명가입니다. 그들은 즉시 다른 숫자의 숫자를 사용하는 인코딩을 생각해 냈습니다. 예를 들어, 2, 8, 16 또는 64자리. 그들은 이렇게 했습니다. '신호가 있다/신호가 없다'에 의존하는 컴퓨터를 편리하게 만드십시오."

"아, 공통점이 뭔지 알겠어... 이 모든 시스템은 2의 거듭제곱에 기반을 두고 있어.

8진 인코딩

"잘 관찰했습니다. 8자리를 포함하는 인코딩부터 시작하겠습니다. 인간은 이것이 가장 쉽다고 생각할 수 있습니다. 숫자 8과 9를 드롭하면 — 붐 — 8진수 인코딩(숫자 체계)이 있습니다. 최근에 리터럴에 대해 들었 . ?"

"예, 그랬습니다."

"글쎄, 놀랍군! 8진수 시스템을 사용하여 인코딩된 숫자 리터럴을 설정할 수 있습니다. 물론 정말 필요한 경우입니다. 들리는 것보다 쉽습니다. 전체 숫자 앞에 0을 넣으면 됩니다.

"그래서 숫자 리터럴이 0으로 시작하면 8진수라는 뜻인가요 ?"

"예, Java는 이를 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을 쓸 수는 없다는 걸 기억하세요."

"하지만 8진수로 만들려고 한다면 할 수 있을까요?"

"예.

이진 인코딩

"아직 이해하지 못하더라도 이진 인코딩은 모국어입니다. 다시 한 번 상기시켜 드리겠습니다. 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는 이진 인코딩에 사용되는 기호 중 하나가 아닙니다.

16진수 인코딩

"2의 4제곱이 뭐죠?"

"열여섯. 저만큼 멀리 온 로봇에게 질문을 제대로 하셨군요!"

"멀리 온 것 같군요. 어쨌든 열여섯. 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
0x b 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

"어떻게 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

"이제 45007이 메모리에 저장되는 방식을 알게 되었습니다."

"네, 그렇습니다. 0x A F C F 입니다. "

"이제 이진법으로 변환해 보겠습니다. 이진법에서는 다음과 같습니다.

0b 1010 1111 1100 1111

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