"Không có gì tốt hơn là mã hóa hiệu quả, Amigo! Hãy tin tưởng vào một người máy cũ kỹ."

"Bạn đang nói về mật mã được sử dụng bởi các điệp viên?"

"Tất nhiên là không. Tôi đang nói về việc trình bày thông tin ở dạng dễ hiểu. Về hệ thống số. Bạn biết rằng trong cuộc sống hàng ngày, hầu hết mọi người sử dụng hệ thống thập phân. Nó sử dụng 10 ký hiệu để biểu thị mọi số: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Có 10 chữ số nên hệ này được gọi là hệ thập phân."

"Điều đó thuận tiện cho con người có mười ngón tay. Nhưng các lập trình viên là những nhà phát minh vĩ đại. Họ ngay lập tức nghĩ ra các bảng mã sử dụng một số chữ số khác nhau. Ví dụ: 2, 8, 16 hoặc 64 chữ số. Họ đã làm điều này để làm cho nó thuận tiện cho các máy tính dựa trên 'có tín hiệu / không có tín hiệu'."

"À, tôi thấy chúng có điểm chung... Tất cả những hệ thống này đều dựa trên lũy thừa của hai người.

mã hóa bát phân

"Quan sát tốt. Hãy bắt đầu với một mã hóa bao gồm 8 chữ số. Con người có thể thấy điều này là dễ nhất: chỉ cần bỏ các số 8 và 9 và — bùm — bạn có mã hóa bát phân (hệ thống số). Gần đây bạn đã được nghe nói về các chữ cái, đúng không ?"

"Đúng."

"Chà, thật ngạc nhiên! Bạn có thể thiết lập các chữ số được mã hóa bằng hệ bát phân. Tất nhiên, nếu bạn thực sự cần. Nó dễ dàng hơn nhiều so với âm thanh. Chỉ cần đặt 0 trước toàn bộ số.

"Vậy nếu một chữ số bắt đầu bằng 0, điều đó có nghĩa là nó là bát phân không ?"

"Có, Java sẽ coi nó là bát phân.

Ví dụ:

Mã số ghi chú
int x = 015; 
x là 13: 1*8+5
int x = 025; 
x là 21: 2*8+5
int x = 0123; 
x là 83: 1*64+2*8+3 == 1*8 2 +2*8 1 +3*8 0
int x = 078;
Điều này sẽ không biên dịch: 8 không phải là một trong những ký hiệu được sử dụng trong mã hóa bát phân.

"Không chắc là bạn cần viết các số bát phân trong mã của mình, nhưng bạn nên biết chúng là gì. " Rốt cuộc, bạn sẽ phải đọc mã do người khác viết. Và như đã đề cập ở trên, các lập trình viên là những nhà phát minh lớn.

Chà, hãy nhớ rằng bạn không thể cứ viết số 0 trước mọi số được."

"Nhưng nếu tôi muốn nó là bát phân, thì tôi có thể?"

"Đúng.

mã hóa nhị phân

"Ngay cả khi bạn chưa hiểu nó, mã hóa nhị phân là ngôn ngữ mẹ đẻ của bạn. Hãy để tôi nhắc bạn về điều đó. Nếu bát phân chỉ có các chữ số 0-7, thì nhị phân chỉ có 0 và 1."

"Tại sao mã hóa này là cần thiết?"

"Như tôi đã đề cập ở trên, điều này hoàn toàn liên quan đến cấu trúc bên trong của máy tính. Mọi thứ trong máy tính đều chạy bằng điện và khi nó xảy ra, cách hiệu quả nhất để lưu trữ và truyền một thứ gì đó bằng điện là sử dụng hai trạng thái: hoặc không có điện trong dây (không) và có điện (một)."

"Đó là lý do tại sao nó rất phổ biến... Hmm, có vẻ như tôi thực sự bắt đầu nhớ ngôn ngữ này!"

"Tất cả robot đều hiểu nó một cách hoàn hảo. Mặc dù nó không được sử dụng thường xuyên trong Java. Java được coi là ngôn ngữ cấp cao, hoàn toàn trừu tượng với phần cứng mà nó chạy trên đó. Thật vậy, bạn có thực sự quan tâm định dạng nào được sử dụng để lưu trữ và xử lý dữ liệu không? bên trong máy tính?

"Nhưng trong nhiều thập kỷ qua, các lập trình viên đã yêu thích mã hóa nhị phân (và các mã hóa khác dựa trên nó). Kết quả là, Java có các toán tử lấy số nhị phân làm đầu vào. Và độ chính xác của các số dấu phẩy động phụ thuộc vào nhị phân của chúng đại diện.

"Tóm lại, bạn nên biết về mã hóa này thì tốt hơn là không biết."

"Phải. Và như trường hợp của mã hóa bát phân, Java có một cách để mã hóa các chữ bằng hệ thống nhị phân."

"Vì vậy, chúng sẽ chỉ được tạo thành từ 0 và 1?"

"Chính xác. Để trình biên dịch Java hiểu rằng mã chứa một chữ số được mã hóa ở dạng nhị phân chứ không chỉ đơn giản là một số thập phân bao gồm các số 0 và 1, theo thông lệ, tất cả các chữ nhị phân bắt đầu bằng tiền tố 0b ( ' b ' xuất phát từ từ nhị phân).

Ví dụ:

Mã số ghi chú
int x = 0b100; 
х là 4: 1*4+0*2+0
int x = 0b1111; 
х là 15: 1*8+1*4+1*2+1
int x = 0b1111000111; 
х là 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;
Điều này sẽ không biên dịch: 2 không phải là một trong những ký hiệu được sử dụng trong mã hóa nhị phân.

mã hóa thập lục phân

"Hai mũ bốn bằng mấy?"

"Mười sáu. Bạn đã tìm ra câu hỏi phù hợp để hỏi một người máy đã đi xa như tôi!"

"Đối với bạn, có vẻ như bạn đã tiến xa. Dù sao thì, mười sáu. Ngoài mã hóa bát phân và nhị phân, chữ cũng có thể được viết bằng hệ thập lục phân. Đây là một bảng mã rất phổ biến.

"Đó là bởi vì mặc dù ký hiệu nhị phân gần nhất có thể với cách các số được lưu trữ thực sự, nhưng con người quá khó để làm việc hiệu quả với các số như vậy: ở dạng nhị phân, số một triệu 20 chữ số, không phải 7.

"Đó là lý do tại sao các lập trình viên nghĩ ra hệ thập lục phân. Rốt cuộc, như bạn đã lưu ý chính xác, 16 là 2 được nâng lên lũy thừa 4, vì vậy chính xác 4 bit tương ứng với một chữ số thập lục phân.

"Vì vậy, cứ 4 bit giờ đây có thể được viết bằng một chữ số thập lục phân."

"Phải. Mã hóa thập lục phân cũng có tiền tố duy nhất của riêng nó: 0x . Ví dụ:

số thập phân ký hiệu nhị phân ký hiệu thập lục phân
17 0b 0001 0001 0x 1 1
4 1 0b 0010 1 00 1 0x2 9 _
85 0b 0101 0101 0x 5 5
256 0b 1 0000 0000 0x 1 0 0

"Được rồi, vậy là đủ rõ ràng về cách chúng tôi có hệ bát phân: chúng tôi chỉ loại bỏ các số 8 và 9. Nhưng chúng tôi lấy 6 chữ số còn thiếu cho hệ thập lục phân ở đâu? Tôi muốn xem chúng!"

"Tất cả đều đơn giản. 6 chữ cái đầu tiên của bảng chữ cái tiếng Anh được coi là 6 chữ số còn thiếu: A (10), B (11), C (12), D (13), E (14), F (15) .

Ví dụ:

ký hiệu thập lục phân ký hiệu nhị phân số thập phân
0x1 _ 0b 0000 0001 1
0x9 _ 0b 0000 1001 9
0x MỘT 0b 0000 1010 10
0xb _ 0b 0000 1011 11
0xC _ 0b 0000 1100 12
0xD _ 0b 0000 1101 13
0xE _ 0b 0000 1110 14
0xF _ 0b 0000 1111 15
0x 1 F 0b 0001 1111 31
0x A F 0b 1010 1111 175
0x F F 0b 1111 1111 255
0x F F F 0b 1111 1111 1111 4095

"Làm thế nào để bạn chuyển đổi một số thập lục phân thành số thập phân?"

"Rất đơn giản. Giả sử bạn có số 0 x A F C F . Số thập phân đó bằng bao nhiêu? Đầu tiên, chúng ta có một hệ thống số theo vị trí, nghĩa là phần đóng góp của mỗi chữ số vào tổng số tăng theo hệ số 16 khi chúng ta di chuyển từ phải sang trái:

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

Ký hiệu A tương ứng với số 10, chữ C cho biết chúng ta có số 12 và chữ F đại diện cho số mười lăm. Chúng tôi nhận được:

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

Nâng 16 lên các lũy thừa khác nhau tương ứng với các chữ số, ta được:

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

Chúng tôi tổng hợp mọi thứ và nhận được:

45007

"Bây giờ bạn đã biết cách 45007 được lưu trữ trong bộ nhớ."

"Có, tôi biết. Đó là 0x A F C F "

"Bây giờ hãy chuyển đổi nó thành nhị phân. Ở dạng nhị phân, nó sẽ là:

0b 1010 1111 1100 1111

"Mỗi bộ bốn bit tương ứng với chính xác một ký tự thập lục phân. Điều đó cực kỳ tiện lợi. Không có bất kỳ phép nhân hay lũy thừa nào."