Trả lời nhanh
OR và XOR chỉ khác nhau ở một trường hợp: khi cả hai bit đều bằng 1. Khi đó OR cho kết quả 1 (có ít nhất một bit 1), còn XOR cho kết quả 0 (vì hai bit giống nhau). Nói gọn: XOR là phép “hoặc loại trừ”, chỉ cho 1 khi hai bit khác nhau.
XOR là gì?
XOR (viết tắt của exclusive OR, tạm dịch “hoặc loại trừ”) là phép toán logic hai ngôi trên bit hoặc giá trị đúng/sai. Kết quả bằng 1 (đúng) khi đúng một trong hai toán hạng bằng 1, tức là hai bit khác nhau.
Trong Python, C++, Java, phép XOR theo từng bit được viết bằng kí hiệu ^. Phép OR theo từng bit được viết bằng |.
Bảng chân trị của OR và XOR
| A | B | A OR B | A XOR B |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 1 |
| 1 | 0 | 1 | 1 |
| 1 | 1 | 1 | 0 |
Hai cột kết quả giống hệt nhau ở ba dòng đầu, chỉ lệch ở dòng cuối (1 và 1). Đây chính là “điểm khác nhau” mà đề bài hay hỏi.
So sánh OR và XOR
| Tiêu chí | OR | XOR |
|---|---|---|
| Cách hiểu | Có ít nhất một bit bằng 1 | Có đúng một bit bằng 1 (hai bit khác nhau) |
| Kết quả với 1 và 1 | 1 | 0 |
| Kí hiệu trong Python | | |
^ |
| Phép với chính nó | A OR A = A | A XOR A = 0 |
| Phép với 0 | A OR 0 = A | A XOR 0 = A |
| Phép với 1 (một bit) | A OR 1 = 1 (luôn bật) | A XOR 1 = NOT A (đảo bit) |
Vì sao XOR lại “loại trừ”?
Trong đời sống, “hoặc” có hai nghĩa. Câu “Bạn có thể uống trà hoặc cà phê” thường hiểu là chọn một trong hai, đó là nghĩa loại trừ (XOR). Câu “Ai biết hát hoặc biết múa thì đăng kí” vẫn cho phép người biết cả hai, đó là nghĩa OR thông thường.
Mẹo nhớ: OR = “có ít nhất một”, XOR = “khác nhau mới là 1”. Nếu hai bit giống nhau thì XOR luôn bằng 0.
Ví dụ tính trên số nguyên (Python)
Khi áp dụng cho số nguyên, ta đổi sang nhị phân rồi tính từng cột bit.
Ví dụ: 5 = 1012, 3 = 0112.
- 5 OR 3: 101 | 011 = 1112 = 7
- 5 XOR 3: 101 ^ 011 = 1102 = 6
print(5 | 3) # 7
print(5 ^ 3) # 6
Hai kết quả khác nhau ở bit cuối cùng bên phải của phần “chung” – cụ thể là bit thứ hai (hàng chục của nhị phân), nơi cả 5 và 3 đều có bit 1: OR giữ 1, XOR đổi thành 0.
Ứng dụng thường gặp của XOR
- Đảo bit chọn lọc: XOR với 1 làm đảo bit, XOR với 0 giữ nguyên. Ví dụ x = 14 (11102), x ^ 4 = 10102 = 10 (bit thứ hai bị tắt); còn x | 4 vẫn bằng 14 vì OR chỉ có thể bật bit chứ không tắt được.
- Hoán đổi hai biến không cần biến phụ: với a = 5, b = 3:
a ^= b→ a = 6;b ^= a→ b = 3 ^ 6 = 5;a ^= b→ a = 6 ^ 5 = 3. Sau ba bước, a = 3, b = 5. - Kiểm tra tính chẵn lẻ (parity): XOR tất cả các bit của một dãy; kết quả 1 nghĩa là số bit 1 là số lẻ. Đây là ý tưởng của bit kiểm tra chẵn lẻ khi truyền dữ liệu.
- Tìm số xuất hiện lẻ lần: vì a ^ a = 0 và a ^ 0 = a nên XOR cả dãy sẽ triệt tiêu các số xuất hiện thành cặp.
- Mã hoá đơn giản: (dữ liệu ^ khoá) ^ khoá = dữ liệu, nên XOR hai lần với cùng khoá sẽ khôi phục dữ liệu ban đầu.
Lỗi sai thường gặp
- Nhầm
^với luỹ thừa. Trong Python, luỹ thừa là**, còn2 ^ 3= 1 (010 ^ 011 = 001). - Nhầm
orvới|.orlà phép logic trên giá trị đúng/sai,|là phép OR theo từng bit. Ví dụ5 or 3cho 5, còn5 | 3cho 7. - Quên rằng 1 XOR 1 = 0. Nhiều bạn mặc định “có 1 là ra 1” như OR.
- Quên căn chỉnh bit khi hai số có độ dài nhị phân khác nhau: cần thêm số 0 vào bên trái cho đủ cột.
Bài luyện tập
Bài 1. Tính 12 OR 10 và 12 XOR 10.
Đáp án: 12 = 11002, 10 = 10102. OR = 11102 = 14; XOR = 01102 = 6.
Bài 2. Tính 1 ^ 2 ^ 3 và 9 ^ 9.
Đáp án: 1 ^ 2 = 01 ^ 10 = 11 = 3; sau đó 3 ^ 3 = 0, nên 1 ^ 2 ^ 3 = 0. Còn 9 ^ 9 = 0 vì hai số giống nhau.
Bài 3. Cho dãy [4, 1, 2, 1, 2]. Dùng XOR tìm số chỉ xuất hiện một lần.
Đáp án: 1 ^ 1 = 0 và 2 ^ 2 = 0 triệt tiêu nhau, còn lại 4 ^ 0 = 4. Số cần tìm là 4.
Câu hỏi thường gặp
XOR là gì?
XOR là phép "hoặc loại trừ": kết quả bằng 1 khi hai bit khác nhau và bằng 0 khi hai bit giống nhau. Trong Python và C++ nó được viết bằng kí hiệu ^.
Điểm khác nhau duy nhất giữa OR và XOR là gì?
Chỉ khác ở trường hợp hai bit cùng bằng 1: 1 OR 1 = 1 còn 1 XOR 1 = 0. Ba trường hợp còn lại hai phép cho kết quả như nhau.
Vì sao XOR hai lần với cùng một số lại ra số ban đầu?
Vì a ^ b ^ b = a ^ (b ^ b) = a ^ 0 = a. Tính chất này được dùng trong hoán đổi biến và mã hoá đơn giản.
Trong Python, ^ có phải là phép luỹ thừa không?
Không. Luỹ thừa là **, còn ^ là XOR theo từng bit. Ví dụ 2 ^ 3 bằng 1, còn 2 ** 3 bằng 8.