Mục lục bài họcĐang ở d01-b1
← IGCSE Computer Science
0/18 bài đã học xong
Chương 1 · Data Representation · Bài 1/2 của chương · bài 1/18 của IGCSE Computer Science

Number systems and binary arithmetic

Hệ đếm và số học nhị phân
← Mục lục bài học
Lý thuyết · English

Why computers use binary

A computer is built from switches that are either on or off. Two states map naturally onto the two digits 0 and 1, so all data must be represented in binary.

Denary to binary

Write the place values for $8$ bits and fit the number into them, largest first:

$128$$64$$32$$16$$8$$4$$2$$1$

For $77$: take $64$ (leaving $13$), then $8$ (leaving $5$), then $4$ (leaving $1$), then $1$.

$$77_{10}=01001101_2$$

Check by adding the place values back: $64+8+4+1=77$ ✓. Always do this check — it catches almost every slip.

Hexadecimal

Hexadecimal is base 16, using the digits $0$–$9$ then $A$–$F$ for $10$–$15$.

Its value is that one hex digit represents exactly four bits, so a byte becomes just two characters:

$$01001101_2=0100\;1101=4\text{D}_{16}$$

Why it is used: hex is shorter and far easier for people to read and write than long strings of bits, so there are fewer mistakes. Computers still work entirely in binary — hex is only for humans.

Common uses: memory addresses, MAC addresses, colour codes in HTML, and error codes.

Binary addition and overflow

The rules: $0+0=0$; $0+1=1$; $1+1=10$ (write $0$, carry $1$); $1+1+1=11$ (write $1$, carry $1$).

Overflow happens when the result needs more bits than are available. Adding two $8$-bit numbers can produce a $9$-bit answer, but only $8$ bits can be stored — so the leftmost bit is lost and the stored answer is wrong.

$$10000000+10000000=1\underline{00000000}$$

The $1$ carried out of the eighth column has nowhere to go. Note the cause: not the arithmetic, but the fixed number of bits.

Logical shifts

A logical left shift moves every bit left; zeros come in on the right and bits falling off the left are lost. Each place shifted multiplies by 2.

$$00001010\;(10)\ \xrightarrow{\text{shift left 1}}\ 00010100\;(20)$$

A logical right shift divides by 2, and any $1$ shifted off the right end is lost — so information can be destroyed.

$$00001011\;(11)\ \xrightarrow{\text{shift right 1}}\ 00000101\;(5)$$

Note $11\div 2=5{,}5$ but the result is $5$: the remainder was lost, not rounded.

Giải thích tiếng Việt

Vì sao máy tính dùng nhị phân. Máy tính được xây từ các công tắc chỉ có hai trạng thái: bật hoặc tắt. Hai trạng thái đó ứng tự nhiên với hai chữ số 01, nên mọi dữ liệu đều phải được biểu diễn ở dạng nhị phân.

Đổi từ thập phân sang nhị phân. Viết ra các giá trị vị trí của $8$ bit rồi lắp số vào, bắt đầu từ giá trị lớn nhất:

$128\quad 64\quad 32\quad 16\quad 8\quad 4\quad 2\quad 1$

Với số $77$: lấy $64$ (còn $13$), rồi $8$ (còn $5$), rồi $4$ (còn $1$), rồi $1$.

$$77_{10}=01001101_2$$

Kiểm lại bằng cách cộng các giá trị vị trí: $64+8+4+1=77$ ✓. Luôn làm bước kiểm này — nó bắt được gần như mọi sai sót.

Hệ thập lục phân. Thập lục phân là hệ cơ số 16, dùng các chữ số $0$–$9$ rồi $A$–$F$ cho $10$–$15$.

Giá trị của nó nằm ở chỗ một chữ số thập lục phân biểu diễn đúng bốn bit, nên một byte chỉ còn hai ký tự:

$$01001101_2=0100\;1101=4\text{D}_{16}$$

Vì sao dùng nó: thập lục phân ngắn hơndễ đọc, dễ viết hơn hẳn so với những chuỗi bit dài, nên ít sai sót hơn. Máy tính vẫn làm việc hoàn toàn bằng nhị phân — thập lục phân chỉ dành cho con người.

Các chỗ dùng phổ biến: địa chỉ bộ nhớ, địa chỉ MAC, mã màu trong HTML, và mã lỗi.

Cộng nhị phân và tràn số. Quy tắc: $0+0=0$; $0+1=1$; $1+1=10$ (viết $0$, nhớ $1$); $1+1+1=11$ (viết $1$, nhớ $1$).

Tràn số xảy ra khi kết quả cần nhiều bit hơn số bit có sẵn. Cộng hai số $8$ bit có thể cho kết quả $9$ bit, nhưng chỉ lưu được $8$ bit — nên bit ngoài cùng bên trái bị mất và kết quả lưu lại sai.

$$10000000+10000000=1\underline{00000000}$$

Chữ số $1$ nhớ ra khỏi cột thứ tám không có chỗ để đi. Chú ý nguyên nhân: không phải phép tính sai, mà là số bit cố định.

Dịch bit lôgic. Dịch trái lôgic đẩy mọi bit sang trái; bên phải điền thêm số $0$, và bit rơi ra khỏi bên trái thì mất. Mỗi lần dịch một vị trí là nhân với 2.

$$00001010\;(10)\ \xrightarrow{\text{dịch trái 1}}\ 00010100\;(20)$$

Dịch phải lôgic thì chia cho 2, và bất kỳ bit $1$ nào rơi ra khỏi bên phải đều bị mất — nên thông tin có thể bị phá huỷ.

$$00001011\;(11)\ \xrightarrow{\text{dịch phải 1}}\ 00000101\;(5)$$

Chú ý $11\div 2=5{,}5$ nhưng kết quả là $5$: phần dư bị mất, không phải được làm tròn.

Tràn số: lỗi không nằm ở phép cộng, mà ở SỐ BIT CÓ HẠN 1 0 0 0 0 0 0 0 + 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 8 bit lưu được bit thứ 9 Bit này KHÔNG CÓ CHỖ ĐỂ ĐI trong thanh ghi 8 bit → BỊ MẤT Đúng ra: 128 + 128 = 256 Máy lưu: 00000000 = 0 ← kết quả SAI Cùng phép cộng đó với thanh ghi 16 bit thì KHÔNG tràn. Nguyên nhân là SỐ BIT, không phải phép tính.
Cùng một phép cộng, thanh ghi 16 bit thì không tràn. Đó là bằng chứng nguyên nhân nằm ở số bit có hạn chứ không ở bản thân phép tính.
Ví dụ — đổi hệ và kiểm lại kết quả

(a) Đổi $77_{10}$ sang nhị phân $8$ bit rồi sang thập lục phân. (b) Đổi $\text{B3}_{16}$ sang nhị phân rồi sang thập phân. Trình bày cách kiểm lại ở mỗi bước.

Giải.

(a) Đổi $77$ sang nhị phân.

Viết các giá trị vị trí: $128\ \ 64\ \ 32\ \ 16\ \ 8\ \ 4\ \ 2\ \ 1$.

  • $128 > 77$ → bit là $0$;
  • $64 \le 77$ → bit là $1$, còn $77-64=13$;
  • $32 > 13$ → $0$;
  • $16 > 13$ → $0$;
  • $8 \le 13$ → $1$, còn $13-8=5$;
  • $4 \le 5$ → $1$, còn $5-4=1$;
  • $2 > 1$ → $0$;
  • $1 \le 1$ → $1$, còn $0$.
$$77_{10}=01001101_2$$

Kiểm lại: $64+8+4+1=77$ ✓

Sang thập lục phân. Tách thành hai nhóm bốn bit:

$$0100\;\big|\;1101$$

$0100_2 = 4$ và $1101_2 = 8+4+1 = 13 = \text{D}$.

$$77_{10}=4\text{D}_{16}$$

Kiểm lại: $4\times 16 + 13 = 64+13=77$ ✓

(b) Đổi $\text{B3}_{16}$ sang nhị phân.

Đổi từng chữ số thành bốn bit — đây là điểm mạnh của thập lục phân:

$\text{B}=11=1011_2$ và $3=0011_2$.

$$\text{B3}_{16}=10110011_2$$

Sang thập phân. Cộng các giá trị vị trí có bit $1$:

$$128+32+16+2+1=179$$

Kiểm lại bằng đường khác: $\text{B}\times 16 + 3 = 11\times 16 + 3 = 176+3=179$ ✓

Vì sao luôn phải kiểm lại. Đổi hệ là công việc cơ học nên rất dễ sót một bit, và một bit sai làm kết quả lệch hẳn.

Phép kiểm chỉ mất vài giây nhưng bắt được gần như mọi sai sót — nhất là khi kiểm bằng đường khác với đường đã dùng để tính, như ở câu (b).

Ví dụ — tràn số và dịch bit

(a) Cộng $10011100_2$ và $11010101_2$ trong thanh ghi $8$ bit. Nêu điều gì xảy ra và giải thích nguyên nhân. (b) Dịch trái lôgic $00001010_2$ một vị trí, rồi dịch phải lôgic $00001011_2$ một vị trí. Nêu tác dụng của mỗi phép.

Giải.

(a) Cộng hai số. Cộng từ phải sang trái:

$10011100 + 11010101$

Cột $1$: $0+1=1$. Cột $2$: $0+0=0$. Cột $3$: $1+1=10$ → viết $0$, nhớ $1$. Cột $4$: $1+0+1(\text{nhớ})=10$ → viết $0$, nhớ $1$. Cột $5$: $1+1+1=11$ → viết $1$, nhớ $1$. Cột $6$: $0+0+1=1$. Cột $7$: $0+1=1$. Cột $8$: $1+1=10$ → viết $0$, nhớ 1 ra ngoài.

$$10011100+11010101=1\,01110001$$

Điều gì xảy ra: TRÀN SỐ. Kết quả cần $9$ bit nhưng thanh ghi chỉ có $8$ bit. Bit nhớ ngoài cùng bên trái không có chỗ để lưu nên bị mất, và giá trị lưu lại là $01110001_2 = 113$ — sai.

Kiểm bằng thập phân: $156 + 213 = 369$, nhưng $8$ bit chỉ lưu được tới $255$. Đúng như dự đoán.

Nguyên nhân. Không phải phép cộng sai — nó hoàn toàn đúng. Vấn đề là số bit cố định của thanh ghi. Cùng phép tính đó trong thanh ghi $16$ bit sẽ không tràn, và đó là bằng chứng cho nguyên nhân thật.

(b) Dịch trái lôgic một vị trí.

$$00001010\ \rightarrow\ 00010100$$

Mọi bit dịch sang trái một chỗ, bên phải điền $0$.

Tác dụng: $10 \rightarrow 20$, tức nhân với $2$.

Dịch phải lôgic một vị trí.

$$00001011\ \rightarrow\ 00000101$$

Mọi bit dịch sang phải một chỗ, bên trái điền $0$, và bit $1$ ở ngoài cùng bên phải rơi ra và mất.

Tác dụng: $11 \rightarrow 5$, tức chia cho $2$.

Chi tiết quan trọng. $11 \div 2 = 5{,}5$ nhưng kết quả là $5$ — phần dư đã bị mất hẳn, không phải được làm tròn.

Đây là lý do dịch phải có thể phá huỷ thông tin: dịch phải rồi dịch trái lại không trả về số ban đầu nếu bit rơi ra là $1$.

Bẫy hay mất điểm — Giải thích tràn số bằng câu “phép cộng bị sai”. Phép cộng nhị phân hoàn toàn đúng — vấn đề nằm ở chỗ kết quả cần nhiều bit hơn số bit thanh ghi có. Cộng hai số $8$ bit có thể cho kết quả $9$ bit, và bit thứ chín không có chỗ để lưu nên bị vứt đi, để lại một giá trị sai. Bằng chứng gọn nhất để nêu trong bài: cùng phép tính đó trong thanh ghi $16$ bit thì không tràn. Nếu nguyên nhân là phép cộng thì đổi số bit đã không giúp được gì. Bẫy đi kèm nằm ở dịch phải lôgic: nghĩ rằng nó làm tròn kết quả. Dịch phải $00001011$ ($11$) cho $00000101$ ($5$), trong khi $11\div 2 = 5{,}5$ — phần dư bị mất hẳn, không được làm tròn lên hay xuống. Hệ quả: dịch phải rồi dịch trái lại không trả về số ban đầu nếu bit rơi ra là $1$, nên phép dịch phá huỷ thông tin.
Phải nhớ — Máy tính dùng nhị phân vì công tắc chỉ có hai trạng thái. Đổi hệ phải luôn kiểm lại bằng cách cộng các giá trị vị trí. Thập lục phân tồn tại vì một chữ số ứng đúng bốn bit, nên nó ngắn và ít sai sót — máy tính vẫn chạy hoàn toàn bằng nhị phân. Tràn số là do số bit có hạn, không phải phép cộng sai. Dịch trái nhân $2$, dịch phải chia $2$ — và dịch phải làm mất phần dư chứ không làm tròn.

Đọc xong rồi — làm thử ngay

Bài tập của chương Data Representation gồm 14 câu trắc nghiệm và 5 đề tự luận. Đáp án hiện ngay khi chọn, miễn phí.

Làm bài tập chương →