Explore all courses in this category.
Explore all courses in this category.
Nguyễn Đình Cường
0 comment
09 Nov, 2026
Dù là bức ảnh, bài hát hay đoạn code bạn đang gõ, trong máy tính tất cả đều chỉ là những số 0 và 1. Hiểu hệ nhị phân giúp bạn thấy rõ giới hạn của số nguyên, cách lưu chữ và vì sao đôi khi 0.1 + 0.2 không bằng đúng 0.3.
Linh kiện điện tử dễ phân biệt hai trạng thái nhất: có điện hoặc không, bật hoặc tắt. Một đơn vị chỉ có hai giá trị gọi là bit (binary digit). Gom 8 bit lại ta được một byte, đơn vị cơ bản để đo dung lượng. Từ đó có KB, MB, GB (tính theo bội của 1024 trong cách truyền thống, hoặc 1000 theo cách ghi của nhiều nhà sản xuất ổ đĩa).
Hệ thập phân dùng 10 chữ số và mỗi vị trí có giá trị gấp 10 lần vị trí bên phải. Hệ nhị phân dùng 2 chữ số và mỗi vị trí gấp 2 lần: 1, 2, 4, 8, 16, 32...
| Nhị phân | Cách tính | Thập phân |
|---|---|---|
| 101 | 4 + 0 + 1 | 5 |
| 1010 | 8 + 0 + 2 + 0 | 10 |
| 11111111 | 128+64+32+16+8+4+2+1 | 255 |
Một byte (8 bit) biểu diễn được 256 giá trị, từ 0 đến 255. Nói chung n bit biểu diễn được 2 mũ n giá trị.
print(bin(10)) # 0b1010
print(int("1010", 2)) # 10
print(2 ** 8) # 256
print(format(255, "08b")) # 11111111Chia liên tiếp cho 2 và ghi lại số dư, đọc từ dưới lên. Ví dụ với 13: 13 chia 2 được 6 dư 1; 6 chia 2 được 3 dư 0; 3 chia 2 được 1 dư 1; 1 chia 2 được 0 dư 1. Đọc ngược các số dư được 1101.
Dãy bit dài rất khó đọc, nên lập trình viên thường dùng hệ thập lục phân (hex) với 16 ký tự 0-9 và A-F. Mỗi chữ số hex tương ứng đúng 4 bit, nên một byte viết gọn thành hai ký tự hex. Bạn gặp hex mỗi ngày khi dùng mã màu CSS: #FF8800 nghĩa là đỏ 255, lục 136, lam 0.
Máy chỉ lưu số, nên người ta quy ước mỗi ký tự ứng với một số. ASCII là bảng mã cổ điển cho chữ cái tiếng Anh: chữ "A" là 65, "a" là 97. Để hỗ trợ tiếng Việt và mọi chữ viết, ngày nay dùng Unicode, thường lưu dưới dạng UTF-8 với độ dài thay đổi từ 1 đến 4 byte mỗi ký tự.
print(ord("A")) # 65
print(chr(97)) # a
print(len("ế".encode("utf-8"))) # 3 byteprint(0.1 + 0.2) # 0.30000000000000004
print(abs(0.1 + 0.2 - 0.3) < 1e-9) # TrueVì vậy khi so sánh số thực, ta thường so sánh gần đúng chứ không dùng ==. Và với tiền tệ, nên dùng kiểu số thập phân chuyên dụng hoặc lưu số nguyên theo đơn vị nhỏ nhất.
Bạn có thể thao tác trực tiếp trên bit bằng AND (&), OR (|), XOR (^) và dịch bit. Chúng được dùng trong đồ họa, mạng, nén dữ liệu, cờ trạng thái:
print(5 & 3) # 1 (101 AND 011 = 001)
print(5 | 3) # 7 (111)
print(5 << 1) # 10 (dịch trái 1 bit = nhân 2)Hãy tự cài đặt phép đổi để hiểu rõ thay vì chỉ dùng bin():
def sang_nhi_phan(n):
if n == 0:
return "0"
bits = ""
while n > 0:
bits = str(n % 2) + bits
n //= 2
return bits
def tu_nhi_phan(s):
ket_qua = 0
for c in s:
ket_qua = ket_qua * 2 + int(c)
return ket_qua
print(sang_nhi_phan(13)) # 1101
print(tu_nhi_phan("1101")) # 13Hàm đầu chia liên tục cho 2 và ghép số dư vào bên trái; hàm sau dùng quy tắc Horner, mỗi chữ số mới làm giá trị cũ nhân đôi rồi cộng chữ số. Hãy thử mở rộng cho cơ số 16, và kiểm tra bằng hex(). Một câu hỏi suy ngẫm: cần tối thiểu bao nhiêu bit để lưu số 1000? (Gợi ý: tìm lũy thừa của 2 đầu tiên lớn hơn 1000.)
Mọi thứ trong máy tính, từ số, chữ đến hình ảnh, đều là dãy bit được quy ước cách giải thích. Biết điều này, bạn dễ hiểu tràn số, lỗi font, sai số thực và nhiều chủ đề khác. Hãy thử tự đổi vài số sang nhị phân bằng tay, sau đó kiểm tra lại bằng code.
Học xong lý thuyết, hãy thực hành thật nhiều; các bài giảng có bài tập trong khóa học codebem.com sẽ giúp bạn việc đó.
Nguyễn Đình Cường
0 comment