Hệ thập lục phân trong một câu
Hệ thập lục phân là hệ đếm theo vị trí với cơ số 16: mỗi chữ số có giá trị gấp 16 lần chữ số bên phải nó, và các giá trị từ 10 đến 15 được viết bằng các chữ cái A đến F. Để cho biết một số là hex, lập trình viên viết 0x1A (C, Java, JavaScript, Python), #1A2B3C cho màu CSS, 1Ah trong hợp ngữ (assembly) hoặc 1A₁₆ trong toán học.
Các chữ số hex từ 0 đến 15
| Thập phân | Hex | Nhị phân | Thập phân | Hex | Nhị phân |
|---|---|---|---|---|---|
| 0 | 0 | 0000 | 8 | 8 | 1000 |
| 1 | 1 | 0001 | 9 | 9 | 1001 |
| 2 | 2 | 0010 | 10 | A | 1010 |
| 3 | 3 | 0011 | 11 | B | 1011 |
| 4 | 4 | 0100 | 12 | C | 1100 |
| 5 | 5 | 0101 | 13 | D | 1101 |
| 6 | 6 | 0110 | 14 | E | 1110 |
| 7 | 7 | 0111 | 15 | F | 1111 |
Cách đếm trong hệ hex
Hệ hex đếm giống hệ thập phân nhưng sang hàng mới sau F thay vì sau 9: … 8, 9, A, B, C, D, E, F, 10, 11 … 19, 1A … 1F, 20 … FF, 100. Ở đây 10 nghĩa là mười sáu và 100 nghĩa là 16 × 16 = 256. Hai chữ số hex biểu diễn một byte (00–FF = 0–255), bốn chữ số lên đến FFFF = 65,535 và tám chữ số lên đến FFFFFFFF = 4,294,967,295.
Vì sao máy tính dùng hệ thập lục phân
Máy tính lưu mọi thứ ở dạng nhị phân, nhưng những dãy dài số 0 và 1 rất khó đọc với con người và dễ gõ nhầm. Vì 16 = 2⁴, một chữ số hex đại diện cho đúng bốn bit (một nibble) và hai chữ số hex cho một byte. Chuyển đổi giữa hex và nhị phân chỉ là tra từng chữ số, và hex ngắn hơn bốn lần: 1101 1110 1010 1101 chỉ là DEAD. Hệ thập phân không có mối liên hệ gọn gàng như vậy với hệ nhị phân, nên hiếm khi được dùng cho dữ liệu thô.
Chuyển hex sang thập phân và ngược lại
- Hex sang thập phân: nhân mỗi chữ số với lũy thừa của 16 tương ứng rồi cộng lại:
2F= 2 × 16 + 15 = 47, và1A3F= 1 × 4096 + 10 × 256 + 3 × 16 + 15 = 6719. - Thập phân sang hex: chia liên tiếp cho 16 và đọc các số dư theo thứ tự ngược lại: 200 ÷ 16 = 12 dư 8, và 12 = C, nên 200 =
C8. - Hex sang nhị phân: thay mỗi chữ số bằng 4 bit tương ứng:
2F=0010 1111.
Các công cụ chuyển đổi của chúng tôi làm tất cả những việc này ngay lập tức và hiển thị từng bước.
Hệ thập lục phân được dùng ở đâu
- Mã màu web:
#FF6347gồm đỏFF, xanh lục63và xanh lam47. - Địa chỉ bộ nhớ: trình gỡ lỗi (debugger) và báo cáo lỗi hiển thị con trỏ như
0x7FFE5A3C. - Địa chỉ MAC: sáu byte như
00:1A:2B:3C:4D:5Edùng để định danh card mạng. - Địa chỉ IPv6: tám nhóm, mỗi nhóm bốn chữ số hex, ví dụ
2001:db8::1. - Unicode: mỗi ký tự có một mã điểm (code point) hex –
U+00E9là é vàU+1F600là 😀. - Mã băm và ID: một mã băm SHA-256 gồm 64 ký tự hex, còn UUID và ID commit Git đều được viết bằng hex.
- Hex dump: các trình hex editor hiển thị nội dung file theo từng byte; mọi file PDF đều bắt đầu bằng
25 50 44 46(“%PDF”). - Mã lỗi: Windows báo các lỗi như
0x80070005(từ chối truy cập).
So sánh hệ thập lục phân, thập phân, bát phân và nhị phân
| Hệ đếm | Cơ số | Chữ số | Cách viết 255 | Ứng dụng điển hình |
|---|---|---|---|---|
| Nhị phân | 2 | 0–1 | 11111111 | Phần cứng, cờ bit |
| Bát phân | 8 | 0–7 | 377 | Quyền truy cập file trên Unix (chmod 755) |
| Thập phân | 10 | 0–9 | 255 | Số dùng hằng ngày |
| Thập lục phân | 16 | 0–9, A–F | FF | Byte, mã màu, địa chỉ, mã băm |
Số âm trong hệ hex
Bản thân hệ hex không có ký hiệu dấu riêng, nên số âm thường được lưu dưới dạng mã bù 2: bit cao nhất của một giá trị có kích thước cố định cho biết đó là số âm. Khi là byte có dấu, 7F là 127, 80 là −128 và FF là −1; khi là số nguyên 32 bit, FFFFFFFF là −1. Trong toán học và trong máy tính hex của chúng tôi, bạn cũng có thể chỉ cần viết dấu trừ: −1A = −26.
Câu hỏi thường gặp
Vì sao hệ thập lục phân dùng chữ cái?
Hệ cơ số 16 cần mười sáu chữ số, mỗi chữ số chỉ gồm một ký tự, nhưng ta chỉ có mười chữ số từ 0 đến 9. Các chữ cái A–F đại diện cho các giá trị 10–15. Chữ hoa và chữ thường có cùng ý nghĩa: ff = FF = 255.
0x ở trước một số có nghĩa là gì?
Nó đánh dấu số đó là số thập lục phân trong C, C++, Java, JavaScript, Python và nhiều ngôn ngữ khác: 0x10 là 16, không phải mười. CSS thì dùng # cho màu, còn mã hợp ngữ thường thêm hậu tố h (10h).
Hệ thập lục phân có giống Base64 không?
Không. Hex viết mỗi byte thành hai ký tự từ 0–9 và A–F, nên dữ liệu tăng gấp đôi kích thước nhưng vẫn dễ đọc theo từng byte. Base64 dùng 64 ký tự và gói 3 byte vào 4 ký tự, gọn hơn (chỉ tăng khoảng 33%) nhưng không đọc được theo từng byte.
Cập nhật lần cuối: