Bốn phép toán trên hai giá trị
Trong bài, `1` biểu diễn **đúng**, `0` biểu diễn **sai**. `AND` đúng khi **cả hai** đúng; `OR` đúng khi **ít nhất một** đúng; `XOR` đúng khi **chỉ một trong hai** đúng; `NOT` đổi đúng thành sai và ngược lại.
| p | q | p AND q | p OR q | p XOR q | NOT p |
|---:|---:|---:|---:|---:|---:|
| 0 | 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 | 0 |
Điểm dễ nhầm: `OR` **bao gồm** trường hợp cả hai đúng, còn `XOR` thì loại trường hợp đó.
Bài luyện
Với p = 1 và q = 1, cặp kết quả (p OR q, p XOR q) là gì?
OR đúng khi ít nhất một giá trị đúng.
OR vẫn phải là 1.
XOR bằng 0 khi hai giá trị giống nhau.
OR = 1, XOR = 0 khi cả hai cùng đúng.
Lời giải
Cả p và q đều đúng nên `p OR q = 1`. XOR chỉ đúng khi hai giá trị khác nhau, nên `p XOR q = 0`.
Dùng ngoặc để thấy thứ tự
Giả sử `p = 1`, `q = 0`, `r = 0`. Với `p AND (q OR r)`, tính trong ngoặc trước: `0 OR 0 = 0`; sau đó `1 AND 0 = 0`. Dấu ngoặc cho biết thứ tự rõ ràng khi biểu thức có nhiều phép toán; không cần đoán thứ tự của ngôn ngữ lập trình khác.
Bài luyện
Cho p = 1, q = 0, r = 1. Giá trị của p AND (q OR r) là gì?
Cần tính cả r trong ngoặc.
Tính ngoặc trước rồi mới AND.
AND có thể bằng 1 khi cả hai toán hạng bằng 1.
Dữ kiện và thứ tự đã rõ.
Lời giải
`q OR r = 0 OR 1 = 1`. Do đó `p AND (q OR r) = 1 AND 1 = 1`.
Mở rộng lên các dãy bit
Với hai dãy **cùng độ dài**, thực hiện phép lôgic trên từng cặp bit ở cùng vị trí. Ví dụ `1010 OR 0011` cho `1011`: vị trí lần lượt là `1 OR 0`, `0 OR 0`, `1 OR 1`, `0 OR 1`. Đây là **OR theo bit**, không phải phép cộng số nhị phân: phép cộng có thể tạo bit nhớ, còn OR không có bit nhớ.
Bài luyện
Kết quả của `1010 AND 1100` theo từng bit là gì?
Đó giống OR ở một số vị trí; AND cần cả hai bit 1.
Chỉ vị trí đầu có 1 ở cả hai dãy.
Hai vị trí này không đồng thời bằng 1.
AND theo bit không tạo thêm bit nhớ.
Lời giải
Ghép từng cặp: `1 AND 1 = 1`, `0 AND 1 = 0`, `1 AND 0 = 0`, `0 AND 0 = 0`. Kết quả `1000`.
Đang học