Dữ liệu & CPU/Bit, byte và hệ cơ số — vì sao máy tính nói nhị phân
2/23
Bài 2 / 23~12 phútBiểu diễn dữ liệuMiễn phí lượt xem

Bit, byte và hệ cơ số — vì sao máy tính nói nhị phân

Bit là gì, một byte lưu được bao nhiêu giá trị, vì sao máy chọn nhị phân thay vì thập phân, và hex chỉ là cách viết tắt cho người. Nền tảng của mọi kiểu dữ liệu.

TL;DR: Máy tính dùng nhị phân vì linh kiện điện tử chỉ phân biệt tin cậy hai trạng thái: có điện và không điện (1 và 0). Một bit là một chữ số nhị phân; gộp 8 bit thành một byte, lưu được 256 giá trị khác nhau (0–255). Hex (cơ số 16) không phải khái niệm mới — nó chỉ là cách viết gọn cho người, vì một chữ số hex khớp đúng 4 bit. Hiểu ba thứ này, bạn đọc được mọi thứ còn lại trong module.

Bạn gõ int x = 65; rồi in ra màn hình thấy 65. Nhưng đồng nghiệp lưu cùng con số đó vào một biến char và in ra chữ A. Cùng các bit 01000001, hai kết quả khác nhau. Vì sao? Vì bản thân các bit không mang ý nghĩa — kiểu dữ liệu mới quyết định cách diễn giải chúng.

Bài này giải thích nền móng đó: bit và byte là gì, vì sao máy chọn nhị phân, và vì sao lập trình viên đọc hex thay vì nhị phân thô — cốt lõi để bạn hiểu mọi kiểu dữ liệu trong các bài sau.

1. Analogy — công tắc đèn

Hình dung một dãy công tắc đèn trên tường. Mỗi công tắc chỉ có hai vị trí: bật hoặc tắt. Một công tắc đơn lẻ kể được rất ít chuyện — chỉ "có" hoặc "không". Nhưng xếp 8 công tắc cạnh nhau, mỗi tổ hợp bật/tắt là một "mã" riêng, và bạn có 256 mã khác nhau. Gán ý nghĩa cho từng mã (mã này là chữ A, mã kia là số 7) là bạn đã có một bảng mã hoá.

CPU và RAM chính là hàng tỷ "công tắc" như vậy. Mỗi công tắc là một bit.

Đời thườngKhái niệm máy tính
Một công tắc đèn (bật/tắt)Một bit (1/0)
8 công tắc xếp hàngMột byte
Bảng "mã nào nghĩa gì"Kiểu dữ liệu / bảng mã
Số tổ hợp bật/tắtSố giá trị lưu được
💡 Cách nhớ

Bit là một câu trả lời có/không. Byte là 8 câu trả lời gộp lại — đủ để phân biệt 256 thứ.

2. Một byte lưu được bao nhiêu giá trị?

Một bit (binary digit) lưu một trong hai giá trị: 0 hoặc 1. Đó là đơn vị thông tin nhỏ nhất máy tính xử lý.

Một bit quá ít để hữu ích, nên máy nhóm 8 bit thành một byte. Vì mỗi bit có 2 lựa chọn và có 8 bit độc lập, số tổ hợp là 2^8 = 256. Một byte do đó biểu diễn được 256 giá trị: từ 0 đến 255.

Công thức tổng quát: n bit lưu được 2^n giá trị.

Số bitSố giá trịVí dụ kiểu dữ liệu
12boolean (về mặt logic)
8256byte, ký tự ASCII
1665.536short, ký tự UTF-16
32hơn 4 tỷint, float
64hơn 18 tỷ tỷlong, double, con trỏ
# Dem so gia tri n bit luu duoc
for n in [8, 16, 32, 64]:
    print(n, "bit ->", 2 ** n, "gia tri")
8 bit -> 256 gia tri
16 bit -> 65536 gia tri
32 bit -> 4294967296 gia tri
64 bit -> 18446744073709551616 gia tri

Đây là lý do int 32-bit có giới hạn quanh 2 tỷ, và vì sao đổi sang long 64-bit cho bạn thêm chỗ chứa khổng lồ. Bài 02 sẽ dùng trực tiếp con số này khi nói về tràn số.

3. Vì sao nhị phân, không phải thập phân?

Câu hỏi tự nhiên: con người đếm cơ số 10, sao máy không làm vậy cho tiện? Lý do nằm ở vật lý phần cứng, không phải toán học.

Một mạch điện tử phân biệt cực kỳ tin cậy giữa hai mức điện áp — ví dụ "gần 0 volt" và "gần 5 volt". Hai mức cách xa nhau nên nhiễu điện nhỏ không làm máy đọc nhầm. Nếu muốn biểu diễn 10 chữ số thập phân, mạch phải phân biệt 10 mức điện áp khác nhau trên cùng một dải — các mức sát nhau, chỉ cần nhiễu nhẹ là đọc sai 6 thành 7. Nhị phân thắng vì nó chống nhiễu và làm linh kiện rẻ, nhanh, đáng tin.

flowchart LR
  A["Tin hieu vat ly"] --> B{"Muc dien ap"}
  B -->|"thap (~0V)"| C["bit 0"]
  B -->|"cao (~5V)"| D["bit 1"]

Cùng lý do này, mọi tầng bên trên — số học, văn bản, hình ảnh, mạng — đều xây trên nền nhị phân. Đó là "ngôn ngữ mẹ đẻ" của máy.

4. Vì sao lập trình viên đọc hex thay vì nhị phân?

Nhị phân đúng cho máy nhưng kinh khủng cho mắt người: địa chỉ bộ nhớ 11111010110010100000000000000000 gần như không đọc nổi. Lập trình viên dùng hexadecimal (cơ số 16) để viết gọn.

Mấu chốt: một chữ số hex biểu diễn đúng 4 bit (vì 2^4 = 16). Nên bạn chia chuỗi nhị phân thành từng nhóm 4 bit và đổi mỗi nhóm thành một ký tự hex 09, AF.

Nhị phânHexThập phân
000000
1010A10
1111F15
1111 1111FF255

Một byte luôn gọn trong đúng 2 chữ số hex (00 đến FF). Đây là lý do bạn thấy hex ở khắp nơi: mã màu CSS #FF8800, địa chỉ bộ nhớ 0x7ffd..., byte trong hex editor.

// Cung mot gia tri 255, ba cach viet
const a = 0b11111111; // binary literal
const b = 0xff;       // hex literal
const c = 255;        // decimal
console.log(a === b && b === c); // true
📚 Đào sâu (tuỳ chọn) — vì sao byte là 8 bit?

Byte không bắt buộc phải 8 bit về mặt lý thuyết — vài máy tính đời đầu dùng 6 hoặc 9 bit. Nhưng 8 bit thắng thế vì nó là luỹ thừa của 2 (chia đôi gọn), đủ chứa một ký tự tiếng Anh mở rộng, và IBM System/360 (1964) chuẩn hoá nó. Ngày nay 8 bit là phổ quát đến mức chuẩn mạng gọi rõ đơn vị 8-bit là octet để tránh mơ hồ. Bạn sẽ gặp lại "octet" trong track Networking khi đọc địa chỉ IP như 192.168.1.1 — mỗi số là một octet.

5. Áp dụng vào code của bạn

Hiểu bit/byte/hex đổi cách bạn ra quyết định hằng ngày:

Chọn kích thước kiểu dữ liệu theo miền giá trị thật. Đừng mặc định long/int64 cho mọi thứ. Một cột "tuổi" hay "số sao 1–5" chỉ cần 1 byte. Nhân lên hàng triệu dòng hoặc hàng triệu object trong RAM, chênh lệch giữa 1 byte và 8 byte là rất lớn.

// Mot bang 50 trieu dong, cot "rating" 1..5
// int   (4 byte) -> 200 MB chi rieng cot nay
// byte  (1 byte) ->  50 MB
// Hieu mien gia tri = tiet kiem 150 MB

Dùng hex khi debug dữ liệu nhị phân. Khi đọc log một packet mạng, một file binary, hay một mã màu, hex giúp bạn thấy ranh giới byte tức thì (mỗi byte = 2 ký tự hex). Tập đọc 4A thành 0100 1010 mà không quy ra thập phân.

Nhầm thường gặp: nghĩ "nhiều bit hơn thì luôn an toàn hơn nên cứ chọn kiểu lớn nhất". ✅ Đúng: chọn kiểu nhỏ nhất chứa đủ miền giá trị tối đa có thể xảy ra. Nhỏ quá thì tràn (bài 02); lớn quá thì phí bộ nhớ và băng thông cache (Course 2).

6. Liên hệ các bài khác

7. Tóm tắt

  • Bit là đơn vị nhỏ nhất, lưu 0 hoặc 1. Byte = 8 bit, lưu 256 giá trị (0–255).
  • Công thức cốt lõi: n bit → 2^n giá trị. Đây là gốc của mọi giới hạn kiểu dữ liệu.
  • Máy dùng nhị phân vì phần cứng phân biệt tin cậy hai mức điện áp — chống nhiễu, rẻ, nhanh.
  • Hex là cách viết tắt cho người: một chữ số hex = 4 bit, một byte = 2 chữ số hex.
  • Bản thân bit không mang nghĩa; kiểu dữ liệu quyết định cách diễn giải chúng.
  • Chọn kích thước kiểu theo miền giá trị thật — không mặc định kiểu lớn nhất.

8. Tự kiểm tra

Tự kiểm tra
Q1
Vì sao máy tính dùng nhị phân thay vì thập phân, dù con người đếm cơ số 10?
Lý do là vật lý phần cứng, không phải toán. Mạch điện tử phân biệt tin cậy hai mức điện áp cách xa nhau (gần 0V và gần mức cao), nên nhiễu nhỏ không gây đọc nhầm. Muốn biểu diễn 10 chữ số thập phân, mạch phải phân biệt 10 mức sát nhau — dễ sai. Nhị phân chống nhiễu tốt, làm linh kiện rẻ và nhanh hơn.
Q2
Một kiểu dữ liệu 16 bit lưu được bao nhiêu giá trị khác nhau? Suy luận thế nào?
Áp dụng công thức 2^n với n = 16, ra 65.536 giá trị. Mỗi bit nhân đôi số tổ hợp, và 16 bit độc lập nên tổng là 2 nhân với chính nó 16 lần. Đây cũng là lý do kiểu short hay ký tự UTF-16 có dải giá trị này.
Q3
Vì sao lập trình viên đọc địa chỉ bộ nhớ dạng hex chứ không phải nhị phân thô?
Vì một chữ số hex ánh xạ đúng 4 bit (2^4 = 16), nên hex là cách nén nhị phân gọn bốn lần mà không mất thông tin. Chuỗi 32 bit dài dằng dặc rút thành 8 ký tự hex dễ đọc. Quan trọng: một byte luôn vừa đúng 2 ký tự hex (00 đến FF), giúp thấy ranh giới byte tức thì khi debug.
Q4
Cùng các bit 01000001, vì sao chỗ in ra số 65, chỗ in ra chữ A?
Vì bản thân các bit không mang ý nghĩa cố địnhkiểu dữ liệu quyết định cách diễn giải. Diễn giải dãy bit đó như số nguyên thì ra 65; diễn giải như mã ký tự ASCII thì ra chữ A (mã 65). Cùng dữ liệu, hai quy ước đọc khác nhau cho hai kết quả khác nhau.
Q5
Bạn cần lưu cột rating chỉ nhận giá trị 1 đến 5 cho 50 triệu dòng. Chọn kiểu 4-byte hay 1-byte, vì sao?
Chọn kiểu 1 byte. Một byte lưu được 0–255, thừa sức chứa 1–5. Dùng kiểu 4-byte phí gấp bốn lần: 200 MB so với 50 MB chỉ riêng cột này. Nguyên tắc: chọn kiểu nhỏ nhất chứa đủ miền giá trị tối đa — đủ an toàn mà tiết kiệm bộ nhớ, và sau này tốt cho cache (Course 2).

Bài tiếp theo: Số nguyên và tràn số

Bài này có giúp bạn hiểu bản chất không?

Hỏi đáp về bài này

Chưa có câu hỏi

Đặt câu hỏi

Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).

Đặt câu hỏi đầu tiên