Cách chuyển nhị phân sang thập phân (và hex): từng bước

Để chuyển một số từ nhị phân sang thập phân, hãy nhân mỗi bit với giá trị vị trí của nó rồi cộng các kết quả lại. Giá trị vị trí là các lũy thừa của 2, tăng gấp đôi từ phải sang trái: 1, 2, 4, 8, 16, v.v. Ví dụ, số nhị phân 1011 là 1×8 + 0×4 + 1×2 + 1×1 = 8 + 0 + 2 + 1 = 11.

Dùng thử miễn phí: Trình chuyển đổi cơ số nguyên Miễn phí, không cần tài khoản.

Bài viết này hướng dẫn cách chuyển nhị phân sang thập phân bằng hai phương pháp, cách đổi ngược từ thập phân sang nhị phân, hệ thập lục phân là gì và vì sao lập trình viên dùng nó, cũng như cách chuyển qua lại giữa nhị phân, hex và bát phân mà không cần máy tính bỏ túi. Mọi ví dụ bên dưới đều đã được kiểm tra bằng code. Để kiểm tra các số của riêng bạn trong lúc đọc, hãy dán chúng vào công cụ chuyển đổi nhị phân miễn phí.

Cách đọc số nhị phân: giá trị vị trí

Mã nhị phân là thông tin được viết chỉ bằng hai ký hiệu 0 và 1. Máy tính dùng nó vì mạch điện của chúng hoạt động với hai trạng thái, chẳng hạn điện áp thấp và điện áp cao. Mỗi chữ số nhị phân được gọi là một bit, và một nhóm 8 bit là một byte.

Nhị phân là hệ đếm theo vị trí, giống như hệ thập phân. Trong hệ thập phân, mỗi vị trí có giá trị gấp 10 lần vị trí bên phải nó (hàng đơn vị, hàng chục, hàng trăm). Trong hệ nhị phân, mỗi vị trí có giá trị gấp 2 lần vị trí bên phải nó:

Vị trí (tính từ phải) Thứ 8 Thứ 7 Thứ 6 Thứ 5 Thứ 4 Thứ 3 Thứ 2 Thứ 1
Lũy thừa của 2 2⁷ 2⁶ 2⁵ 2⁴ 2⁰
Giá trị vị trí 128 64 32 16 8 4 2 1

Chữ số 1 nghĩa là "tính giá trị vị trí này", còn 0 nghĩa là "bỏ qua".

Cách chuyển nhị phân sang thập phân từng bước

Phương pháp 1: cộng các giá trị vị trí

Lấy số nhị phân 11010110. Viết giá trị vị trí bên dưới từng bit, giữ lại những vị trí có bit bằng 1 rồi cộng chúng lại:

Bit 1 1 0 1 0 1 1 0
Giá trị vị trí 128 64 32 16 8 4 2 1
Bit × giá trị 128 64 0 16 0 4 2 0

128 + 64 + 16 + 4 + 2 = 214. Vậy 11010110₂ = 214₁₀. Chỉ số nhỏ phía dưới cho biết cơ số khi điều đó chưa rõ ràng.

Phương pháp 2: nhân đôi rồi cộng

Phương pháp này không cần bảng. Bắt đầu từ 0, rồi đọc các bit từ trái sang phải: nhân đôi tổng hiện tại và cộng thêm bit đang xét.

Với 101101:

  1. 0 × 2 + 1 = 1
  2. 1 × 2 + 0 = 2
  3. 2 × 2 + 1 = 5
  4. 5 × 2 + 1 = 11
  5. 11 × 2 + 0 = 22
  6. 22 × 2 + 1 = 45

Vậy 101101₂ = 45. Kiểm tra lại bằng phương pháp 1: 32 + 8 + 4 + 1 = 45.

Cách chuyển thập phân sang nhị phân

Chia liên tiếp cho 2

Chia số cho 2, ghi lại số dư (0 hoặc 1), rồi lặp lại với thương cho đến khi thương bằng 0. Sau đó đọc các số dư từ dưới lên. Ví dụ với 156:

Phép chia Thương Số dư
156 ÷ 2 78 0
78 ÷ 2 39 0
39 ÷ 2 19 1
19 ÷ 2 9 1
9 ÷ 2 4 1
4 ÷ 2 2 0
2 ÷ 2 1 0
1 ÷ 2 0 1

Đọc từ dưới lên ta được 156 = 10011100₂. Kiểm tra: 128 + 16 + 8 + 4 = 156. Lỗi thường gặp nhất là đọc số dư từ trên xuống, khiến các bit bị đảo ngược thứ tự.

Trừ dần các lũy thừa của 2

Với số nhỏ, cách nhanh hơn thường là lấy lũy thừa của 2 lớn nhất không vượt quá số đó, trừ đi, rồi lặp lại. Với 100: lấy 64 (100 − 64 = 36), tiếp theo là 32 (36 − 32 = 4), rồi 4 (4 − 4 = 0). Đặt 1 dưới 64, 32 và 4, các vị trí còn lại đều là 0: 100 = 1100100₂.

Hệ thập lục phân là gì?

Hệ thập lục phân (hex) là hệ cơ số 16. Hệ này cần 16 chữ số, nên sau 0–9 nó dùng các chữ cái A–F cho các giá trị từ 10 đến 15: A = 10, B = 11, C = 12, D = 13, E = 14, F = 15. Mỗi vị trí có giá trị gấp 16 lần vị trí bên phải nó: 1, 16, 256, 4.096, v.v.

Lập trình viên dùng hex vì nó khớp chính xác với nhị phân. Bốn bit có 16 tổ hợp khả dĩ (0000 đến 1111), nên một chữ số hex đúng bằng 4 bit, và hai chữ số hex đúng bằng một byte. Byte lớn nhất, 11111111, trong hex chỉ đơn giản là FF, còn trong thập phân là 255, một con số không cho thấy mẫu bit. Đó là lý do địa chỉ bộ nhớ, mã màu, địa chỉ MAC và địa chỉ IPv6 được viết bằng hex.

Cách chuyển hex sang thập phân

Dùng cùng phương pháp giá trị vị trí với các lũy thừa của 16, và thay các chữ cái bằng giá trị của chúng:

Cách chuyển thập phân sang thập lục phân

Chuyển thập phân sang thập lục phân giống như chuyển thập phân sang nhị phân, nhưng chia cho 16. Các số dư từ 10 đến 15 được viết thành chữ cái A đến F. Ví dụ với 1000:

Phép chia Thương Số dư
1000 ÷ 16 62 8
62 ÷ 16 3 14 = E
3 ÷ 16 0 3

Đọc các số dư từ dưới lên ta được 1000 = 3E8₁₆. Kiểm tra: 3 × 256 + 14 × 16 + 8 = 768 + 224 + 8 = 1000.

Nhị phân sang thập lục phân: nhóm bit theo bộ bốn

Vì một chữ số hex là bốn bit, việc chuyển nhị phân sang thập lục phân hoàn toàn không cần tính toán. Chia số nhị phân thành các nhóm bốn bit (gọi là nibble), bắt đầu từ bên phải, rồi thay mỗi nhóm theo bảng sau:

Nhị phân Hex Thập phân Nhị phân Hex Thập phân
0000 0 0 1000 8 8
0001 1 1 1001 9 9
0010 2 2 1010 A 10
0011 3 3 1011 B 11
0100 4 4 1100 C 12
0101 5 5 1101 D 13
0110 6 6 1110 E 14
0111 7 7 1111 F 15

Ví dụ:

Chuyển hex sang nhị phân thì làm ngược lại: thay mỗi chữ số hex bằng bốn bit tương ứng. 3E8 → 0011 1110 1000 → 1111101000 sau khi bỏ các số 0 đứng đầu.

Sơ lược về hệ bát phân

Hệ bát phân (octal) là hệ cơ số 8, dùng các chữ số 0–7. Nó hoạt động giống hex nhưng với nhóm ba bit, vì 2³ = 8. Ứng dụng nổi tiếng nhất của nó ngày nay là quyền truy cập tệp trên Unix. Trong chmod 755, mỗi chữ số là ba bit quyền (đọc, ghi, thực thi):

Vậy 755 trong hệ bát phân là mẫu bit 111 101 101, tức 493 trong hệ thập phân. Máy tính Chmod chuyển các ô quyền được đánh dấu thành số bát phân, hoặc cho biết một số như 755 thiết lập những quyền nào.

Bạn gặp các phép chuyển đổi này ở đâu

Tiền tố: 0b, 0x và 0o

Trong code, tiền tố cho trình biên dịch biết một hằng số dùng cơ số nào:

Tiền tố Cơ số Ví dụ Giá trị thập phân
0b Nhị phân (2) 0b1011 11
0o Bát phân (8) 0o755 493
0x Thập lục phân (16) 0x3E8 1000

0x dùng được trong hầu hết mọi ngôn ngữ. 0b được hỗ trợ trong Python, JavaScript, Java, C# và C++. 0o được dùng trong Python và JavaScript, còn C và C++ viết số bát phân chỉ với một số 0 đứng đầu, nên 0755 trong C là 493, không phải 755.

Hầu hết các ngôn ngữ cũng có thể chuyển đổi chuỗi giúp bạn:

# Python
int("1011", 2)      # 11
bin(156)            # '0b10011100'
hex(1000)           # '0x3e8'
int("3E8", 16)      # 1000

// JavaScript
parseInt("1011", 2)     // 11
(1000).toString(16)     // "3e8"
Number("0b1011")        // 11

Một cái bẫy: trong JavaScript, parseInt("0b1011") trả về 0, vì parseInt dừng lại ở ký tự đầu tiên nó không đọc được và không hiểu tiền tố 0b. Hãy bỏ tiền tố và truyền cơ số (radix) vào, như được giải thích trong tài liệu MDN về parseInt.

Lưu ý về số âm

Máy tính thường lưu số nguyên âm dưới dạng bù hai (two's complement). Để viết −5 bằng 8 bit, bắt đầu từ 5 = 00000101, đảo mọi bit để được 11111010, rồi cộng 1: 11111011. Nếu đọc như số không dấu, cùng mẫu bit này là 251 (256 − 5), hay FB trong hex. Đó là lý do cùng một byte có thể mang nghĩa −5 hoặc 251, tùy theo chương trình coi nó là số có dấu hay không.

Bảng chuyển đổi nhị phân, thập phân, bát phân và hex

Thập phân Nhị phân Bát phân Hex
0 0 0 0
1 1 1 1
2 10 2 2
3 11 3 3
4 100 4 4
5 101 5 5
6 110 6 6
7 111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F
16 10000 20 10
32 100000 40 20
64 1000000 100 40
100 1100100 144 64
127 1111111 177 7F
128 10000000 200 80
255 11111111 377 FF
256 100000000 400 100

Chuyển đổi mọi cơ số với công cụ chuyển đổi nhị phân

Công cụ chuyển đổi nhị phân miễn phí chạy ngay trong trình duyệt. Nhập một số và chọn cơ số của nó, công cụ sẽ hiển thị giá trị ở dạng nhị phân, bát phân, thập phân và thập lục phân cùng lúc, kèm thêm một cơ số đầu ra tùy chọn.

Một vài giới hạn cần biết: công cụ chỉ chuyển đổi số nguyên không âm, nên dấu trừ hoặc dấu thập phân sẽ bị từ chối; đầu ra hex là chữ thường và không có số 0 đứng đầu; và hàng "Base64 (64)" là số cơ số 64 dùng các chữ số 0–9, a–z, A–Z, + và /, không phải mã hóa văn bản Base64.

Câu hỏi thường gặp

Số lớn nhất có thể lưu trong 8 bit là bao nhiêu?

255, viết là 11111111 trong nhị phân hoặc FF trong hex. Tám bit cho 2⁸ = 256 mẫu khác nhau, bao phủ từ 0 đến 255. Mười sáu bit đạt tới 65.535, và mỗi bit thêm vào lại nhân đôi phạm vi.

Vì sao lập trình viên dùng thập lục phân thay vì thập phân?

Vì mỗi chữ số hex tương ứng đúng bốn bit, bạn có thể đọc mẫu bit trực tiếp từ các chữ số hex. Một byte luôn là hai chữ số hex (00 đến FF). Hệ thập phân không có sự tương ứng như vậy: 255 và 256 trông gần giống nhau trong thập phân nhưng lại là 11111111 và 100000000 trong nhị phân.

Làm sao chuyển phân số nhị phân sang thập phân?

Các bit sau dấu chấm nhị phân có giá trị 1/2, 1/4, 1/8, v.v. Vậy 101.11₂ = 4 + 1 + 0,5 + 0,25 = 5,75. Nhiều phân số thập phân, chẳng hạn 0,1, không có dạng nhị phân chính xác, đó là lý do 0.1 + 0.2 không đúng bằng 0.3 trong hầu hết các ngôn ngữ lập trình. Công cụ chuyển đổi nhị phân chỉ xử lý số nguyên.

Mã nhị phân có giống ASCII không?

Không. Nhị phân là hệ đếm; ASCII là một bảng gán một số cho mỗi ký tự. Chữ A có mã ASCII 65, và số đó được lưu dưới dạng các bit 01000001.

Dùng thử miễn phí: Trình chuyển đổi cơ số nguyên Miễn phí, không cần tài khoản.