Hệ nhị phân và hệ cơ số
Máy tính lưu mọi thứ bằng hai trạng thái bật và tắt, tức là các chữ số 0 và 1: đó là hệ nhị phân. Hiểu cách viết số trong các hệ cơ số giúp giải nhiều bài thi (mã nhị phân, quả cân, bóng đèn…) và là nền tảng cho bài Phép toán bit.
Hệ thập phân là hệ cơ số 10
Phần tiêu đề “Hệ thập phân là hệ cơ số 10”Số 2026 nghĩa là 2 nghìn, 0 trăm, 2 chục, 6 đơn vị:
2026 = 2 × 103 + 0 × 102 + 2 × 101 + 6 × 100
Mỗi vị trí có giá trị gấp 10 lần vị trí bên phải nó, và chỉ dùng các chữ số 0 đến 9.
Hệ cơ số b
Phần tiêu đề “Hệ cơ số b”Thay 10 bằng b (b ≥ 2): mỗi vị trí gấp b lần vị trí bên phải, dùng các chữ số 0 đến b - 1. Với b lớn hơn 10, dùng thêm chữ cái: A = 10, B = 11, …, F = 15 (hệ 16, còn gọi là thập lục phân).
Số nhị phân 1101 có giá trị:
1 × 23 + 1 × 22 + 0 × 21 + 1 × 20 = 8 + 4 + 0 + 1 = 13
Đổi từ hệ b sang hệ 10 nhanh hơn bằng cách đọc từ trái sang phải: giá trị mới = giá trị cũ × b + chữ số (giống cách tính số dư của số rất lớn). Với 1101: 1 → 1 × 2 + 1 = 3 → 3 × 2 + 0 = 6 → 6 × 2 + 1 = 13.
Đổi từ hệ 10 sang hệ b
Phần tiêu đề “Đổi từ hệ 10 sang hệ b”Chia liên tiếp cho b, số dư lần lượt là các chữ số từ phải sang trái (giống tách chữ số với 10). Đổi 13 sang hệ 2:
| n | n % 2 | n // 2 |
|---|---|---|
| 13 | 1 | 6 |
| 6 | 0 | 3 |
| 3 | 1 | 1 |
| 1 | 1 | 0 |
Đọc số dư từ dưới lên: 13 = 1101(2).
CHU_SO = "0123456789ABCDEF"
def doi_co_so(n, b): if n == 0: return "0" s = "" while n > 0: s = CHU_SO[n % b] + s # số dư là chữ số, ghép vào bên trái n //= b return s
def ve_thap_phan(s, b): gia_tri = 0 for c in s: gia_tri = gia_tri * b + CHU_SO.index(c) return gia_tri
print(doi_co_so(13, 2), doi_co_so(255, 16), ve_thap_phan("1101", 2)) # 1101 FF 13#include <iostream>#include <string>using namespace std;
const string CHU_SO = "0123456789ABCDEF";
string doiCoSo(long long n, int b) { if (n == 0) return "0"; string s = ""; while (n > 0) { s = CHU_SO[n % b] + s; // số dư là chữ số, ghép vào bên trái n /= b; } return s;}
long long veThapPhan(const string& s, int b) { long long giaTri = 0; for (char c : s) giaTri = giaTri * b + CHU_SO.find(c); return giaTri;}
int main() { cout << doiCoSo(13, 2) << " " << doiCoSo(255, 16) << " " << veThapPhan("1101", 2) << endl; // 1101 FF 13 return 0;}Lưu ý: trường hợp n = 0 phải xử lý riêng, nếu không vòng lặp không chạy lần nào và trả về xâu rỗng.
Vì sao hệ nhị phân quan trọng?
Phần tiêu đề “Vì sao hệ nhị phân quan trọng?”- Có k bóng đèn (mỗi bóng bật hoặc tắt) thì biểu diễn được 2k trạng thái, tức các số từ 0 đến 2k - 1. Với 8 bóng (1 byte): 0 đến 255.
- Mọi số tự nhiên đều viết được duy nhất thành tổng các lũy thừa khác nhau của 2. Vì vậy với các quả cân 1, 2, 4, 8, … gam ta cân được mọi khối lượng nguyên, mỗi quả dùng nhiều nhất một lần (bài 14).
- Hệ 16 dùng để viết gọn nhị phân: mỗi chữ số hệ 16 ứng với đúng 4 chữ số nhị phân (F = 1111), nên mã màu #FF8800 dễ đọc hơn 111111111000100000000000.
Luyện tập
Phần tiêu đề “Luyện tập”Gồm 23 bài, chia thành 4 nhóm từ dễ đến khó. Mỗi bài có một dữ liệu kiểm tra: các bạn chạy chương trình của mình với dữ liệu đó rồi so với đáp số.
Nhóm 1. Đổi cơ số
Phần tiêu đề “Nhóm 1. Đổi cơ số”Bài 1. Đổi sang nhị phân
Phần tiêu đề “Bài 1. Đổi sang nhị phân”Nhập n (0 ≤ n ≤ 1018). In ra biểu diễn nhị phân của n.
Ví dụ: nhập 13 thì in ra 1101.
Kiểm tra: nhập 2026.
Bài 2. Đổi nhị phân sang thập phân
Phần tiêu đề “Bài 2. Đổi nhị phân sang thập phân”Nhập một xâu nhị phân (độ dài ≤ 62, không có số 0 thừa ở đầu, trừ số 0). In ra giá trị thập phân.
Ví dụ: nhập 1101 thì in ra 13.
Kiểm tra: nhập 11111101010.
Bài 3. Đổi sang hệ cơ số b
Phần tiêu đề “Bài 3. Đổi sang hệ cơ số b”Nhập n, b (0 ≤ n ≤ 1018, 2 ≤ b ≤ 16). In ra biểu diễn của n trong hệ cơ số b (dùng chữ in hoa A-F cho 10-15).
Ví dụ: nhập 255 16 thì in ra FF.
Kiểm tra: nhập 2026 7.
Bài 4. Đổi từ hệ cơ số b về thập phân
Phần tiêu đề “Bài 4. Đổi từ hệ cơ số b về thập phân”Nhập xâu s và b (2 ≤ b ≤ 16, giá trị không quá 1018, chữ cái in hoa). In ra giá trị thập phân của s trong hệ cơ số b.
Ví dụ: nhập FF 16 thì in ra 255.
Kiểm tra: nhập 5623 7.
Bài 5. Đổi giữa hai hệ cơ số
Phần tiêu đề “Bài 5. Đổi giữa hai hệ cơ số”Nhập s, a, b (2 ≤ a, b ≤ 16, giá trị không quá 1018). s là một số viết trong hệ a, in ra số đó viết trong hệ b.
Ví dụ: nhập 1101 2 16 thì in ra D.
Kiểm tra: nhập 7E9 16 3.
Bài 6. Số chữ số trong hệ cơ số b
Phần tiêu đề “Bài 6. Số chữ số trong hệ cơ số b”Nhập n, b (1 ≤ n ≤ 1018, 2 ≤ b ≤ 109). In ra số chữ số của n khi viết trong hệ b.
Ví dụ: nhập 13 2 thì in ra 4.
Kiểm tra: nhập 1000000000000000000 2.
Bài 7. Số La Mã
Phần tiêu đề “Bài 7. Số La Mã”Nhập n (1 ≤ n ≤ 3999). In ra n viết bằng số La Mã (I = 1, V = 5, X = 10, L = 50, C = 100, D = 500, M = 1000; viết 4 là IV, 9 là IX, 40 là XL, 90 là XC, 400 là CD, 900 là CM).
Ví dụ: nhập 14 thì in ra XIV.
Kiểm tra: nhập 2026.
Nhóm 2. Chữ số trong các hệ cơ số
Phần tiêu đề “Nhóm 2. Chữ số trong các hệ cơ số”Bài 8. Đếm chữ số 1 trong nhị phân
Phần tiêu đề “Bài 8. Đếm chữ số 1 trong nhị phân”Nhập n (0 ≤ n ≤ 1018). In ra số chữ số 1 trong biểu diễn nhị phân của n.
Ví dụ: nhập 13 thì in ra 3.
Kiểm tra: nhập 2026.
Bài 9. Tổng chữ số trong hệ cơ số b
Phần tiêu đề “Bài 9. Tổng chữ số trong hệ cơ số b”Nhập n, b (n ≤ 1018, 2 ≤ b ≤ 109). In ra tổng các chữ số (tính theo giá trị) của n khi viết trong hệ b.
Ví dụ: nhập 255 16 thì in ra 30.
Kiểm tra: nhập 2026 3.
Bài 10. Số chữ số 0 tận cùng trong hệ b
Phần tiêu đề “Bài 10. Số chữ số 0 tận cùng trong hệ b”Nhập n, b (1 ≤ n ≤ 1018, 2 ≤ b ≤ 109). Khi viết n trong hệ b thì có bao nhiêu chữ số 0 ở tận cùng?
Ví dụ: nhập 24 2 thì in ra 3.
Kiểm tra: nhập 1000000000000000000 4.
Bài 11. Cộng hai số nhị phân
Phần tiêu đề “Bài 11. Cộng hai số nhị phân”Nhập hai xâu nhị phân (mỗi xâu dài không quá 105), mỗi xâu một dòng. In ra tổng của chúng ở dạng nhị phân.
Ví dụ:
| Nhập | In ra |
|---|---|
1011110 | 10001 |
Kiểm tra: nhập
1111111111Bài 12. So sánh hai số nhị phân
Phần tiêu đề “Bài 12. So sánh hai số nhị phân”Nhập hai xâu nhị phân dài (mỗi xâu ≤ 105 chữ số, có thể có số 0 thừa ở đầu), mỗi xâu một dòng. In ra <, = hoặc > cho biết số thứ nhất so với số thứ hai.
Ví dụ:
| Nhập | In ra |
|---|---|
10111 | > |
Kiểm tra: nhập
000110110Bài 13. Số đối xứng ở cả hai hệ
Phần tiêu đề “Bài 13. Số đối xứng ở cả hai hệ”Nhập n (n ≤ 106). Đếm các số từ 1 đến n đối xứng (đọc xuôi ngược như nhau) cả khi viết trong hệ 10 và trong hệ 2.
Ví dụ: nhập 10 thì in ra 5.
Kiểm tra: nhập 1000000.
Nhóm 3. Ứng dụng
Phần tiêu đề “Nhóm 3. Ứng dụng”Bài 14. Bao lì xì
Phần tiêu đề “Bài 14. Bao lì xì”Có các bao lì xì chứa lần lượt 1, 2, 4, 8, …, 262 đồng (mỗi bao một số tiền). Nhập n (1 ≤ n ≤ 1018). Chọn các bao có tổng đúng bằng n. In ra số tiền của các bao được chọn theo thứ tự tăng dần.
Ví dụ: nhập 13 thì in ra 1 4 8.
Kiểm tra: nhập 2026.
Bài 15. Quả cân hai đĩa
Phần tiêu đề “Bài 15. Quả cân hai đĩa”Có các quả cân 1, 3, 9, 27, …, 3k gam (mỗi loại một quả) và cân hai đĩa: quả cân được đặt ở đĩa bên kia hoặc cùng đĩa với vật. Nhập n (1 ≤ n ≤ 1012), in ra số quả cân ít nhất cần dùng để cân vật nặng n gam.
Ví dụ: nhập 5 thì in ra 3.
Kiểm tra: nhập 2026.
Bài 16. Đếm số có đúng k chữ số 1
Phần tiêu đề “Bài 16. Đếm số có đúng k chữ số 1”Nhập n, k (1 ≤ n ≤ 1018, 1 ≤ k ≤ 60). Đếm các số từ 1 đến n mà biểu diễn nhị phân có đúng k chữ số 1.
Ví dụ: nhập 10 2 thì in ra 5.
Kiểm tra: nhập 2026 5.
Bài 17. Số may mắn thứ k
Phần tiêu đề “Bài 17. Số may mắn thứ k”Số may mắn là số chỉ gồm chữ số 4 và 7: 4, 7, 44, 47, 74, 77, 444, … (sắp tăng dần). Nhập k (k ≤ 1018), in ra số may mắn thứ k.
Ví dụ: nhập 5 thì in ra 74.
Kiểm tra: nhập 2026.
Bài 18. Mã màu
Phần tiêu đề “Bài 18. Mã màu”Màu trên máy tính được ghi dạng #RRGGBB, trong đó RR, GG, BB là ba số hệ 16 (mỗi số hai chữ số, từ 00 đến FF) cho độ đỏ, xanh lá, xanh dương. Nhập một mã màu (chữ in hoa), in ra ba số thập phân R G B.
Ví dụ: nhập #FF8800 thì in ra 255 136 0.
Kiểm tra: nhập #1E90FF.
Nhóm 4. Mở rộng
Phần tiêu đề “Nhóm 4. Mở rộng”Bài 19. Địa chỉ IP
Phần tiêu đề “Bài 19. Địa chỉ IP”Địa chỉ IPv4 gồm 4 số từ 0 đến 255 viết cách nhau dấu chấm, chính là một số 32 bit viết trong hệ 256. Nhập một địa chỉ IP, in ra giá trị của nó (số = a × 2563 + b × 2562 + c × 256 + d).
Ví dụ: nhập 0.0.1.1 thì in ra 257.
Kiểm tra: nhập 192.168.1.1.
Bài 20. Hệ cơ số âm hai
Phần tiêu đề “Bài 20. Hệ cơ số âm hai”Mọi số nguyên đều viết được duy nhất trong hệ cơ số -2: mỗi chữ số là 0 hoặc 1, vị trí thứ i (từ phải, đếm từ 0) có giá trị (-2)i. Nhập n (|n| ≤ 1015), in ra biểu diễn của n trong hệ -2.
Ví dụ: nhập 6 thì in ra 11010.
Kiểm tra: nhập -2026.
Bài 21. Phân số trong hệ nhị phân
Phần tiêu đề “Bài 21. Phân số trong hệ nhị phân”Nhập p, q, k (0 ≤ p nhỏ hơn q ≤ 109, k ≤ 1000). In ra k chữ số đầu tiên sau dấu phẩy của p / q viết trong hệ 2 (in liền nhau).
Ví dụ: nhập 1 4 4 thì in ra 0100.
Kiểm tra: nhập 1 10 12.
Bài 22. Cơ số để toàn chữ số 1
Phần tiêu đề “Bài 22. Cơ số để toàn chữ số 1”Nhập n (3 ≤ n ≤ 106). Tìm cơ số b nhỏ nhất (b ≥ 2) để n viết trong hệ b chỉ gồm toàn chữ số 1.
Ví dụ: nhập 13 thì in ra 3.
Kiểm tra: nhập 4681.
Bài 23. Đèn báo hiệu
Phần tiêu đề “Bài 23. Đèn báo hiệu”Một hàng có k bóng đèn, mỗi bóng có 3 trạng thái: tắt, xanh, đỏ. Người ta dùng hàng đèn để báo số: số được báo là giá trị trong hệ 3 với tắt = 0, xanh = 1, đỏ = 2 (bóng trái nhất là chữ số cao nhất). Nhập k và n (k ≤ 38, n nhỏ hơn 3k), in ra trạng thái từng bóng từ trái sang phải dưới dạng xâu gồm T, X, D.
Ví dụ: nhập 3 5 thì in ra TXD.
Kiểm tra: nhập 8 2026.