Hệ nhị phân, bit và byte: máy tính lưu dữ liệu như thế nào?

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

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.

Vì sao máy tính dùng 0 và 1?

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).

Đếm trong hệ nhị phân

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ânCách tínhThập phân
1014 + 0 + 15
10108 + 0 + 2 + 010
11111111128+64+32+16+8+4+2+1255

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")) # 11111111

Đổi từ thập phân sang nhị phân

Chia 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.

Hệ thập lục phân

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.

Lưu chữ cái: ASCII và Unicode

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 byte

Số âm và số thực

  • Số âm thường lưu theo dạng bù hai (two's complement): 8 bit có dấu biểu diễn từ -128 đến 127.
  • Số thực lưu theo chuẩn dấu phẩy động (floating point). Nhiều số thập phân như 0.1 không biểu diễn chính xác bằng nhị phân, nên có sai số rất nhỏ.
print(0.1 + 0.2)            # 0.30000000000000004
print(abs(0.1 + 0.2 - 0.3) < 1e-9)   # True

Vì 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.

Phép toán bit

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)

Bài tập: tự viết hàm đổi hệ số

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"))   # 13

Hà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.)

Kết luận

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 đó.

author_photo
Nguyễn Đình Cường

0 comment