Tất cả bài viết

Phép toán bit: AND, OR và XOR hoạt động như thế nào ở cấp độ bit

Trong lập trình đồ họa web (canvas, WebGL), một màu RGBA như rgba(58, 127, 217, 0.8) thường được lưu bên trong dưới dạng một số nguyên 32-bit duy nhất, mỗi kênh màu chiếm gọn 8 bit — tách riêng kênh xanh dương chỉ cần một phép dịch bit rồi AND với 0xFF.

AND, OR, XOR, NOT — bốn phép toán cơ bản

  • AND (&) — bit kết quả là 1 chỉ khi cả hai bit đầu vào đều là 1. Dùng để tách riêng một kênh màu khỏi giá trị đã đóng gói.
  • OR (|) — bit kết quả là 1 nếu ít nhất một trong các bit đầu vào là 1. Dùng để gộp nhiều kênh hoặc cờ vào một giá trị duy nhất.
  • XOR (^) — bit kết quả là 1 nếu các bit đầu vào khác nhau; áp dụng XOR hai lần với cùng một giá trị sẽ trả về giá trị gốc.
  • NOT (~) — đảo ngược từng bit của một số.

AND theo bit khác gì với AND logic

AND logic (&& trong hầu hết ngôn ngữ) hoạt động trên toàn bộ giá trị boolean và trả về true/false, trong khi AND theo bit (&) xử lý từng bit của hai số riêng biệt và trả về một số. Nhầm lẫn giữa hai cái này là nguyên nhân gây lỗi thường gặp, nhất là vì ở một số ngôn ngữ cả hai đều biên dịch được mà không báo lỗi kiểu dữ liệu.

Vì sao công cụ này thường đi cùng bộ chuyển đổi hệ cơ số

Một giá trị màu đóng gói bằng 3866089688 ở hệ thập phân chẳng nói lên điều gì khi nhìn thoáng qua, nhưng cũng con số đó viết dưới dạng 0xE68A57D8 lập tức cho thấy bốn kênh riêng biệt theo từng byte. Đó là lý do các phép toán bit hầu như luôn được suy luận bằng hệ nhị phân hoặc thập lục phân chứ không phải thập phân — bộ chuyển đổi hệ cơ số thường là bước đầu tiên trước khi AND/OR/XOR có ý nghĩa trực quan.

Vì sao cần điều này

  • Lưu trữ và kiểm tra hiệu quả một tập hợp các cờ boolean trong một số duy nhất.
  • Hiểu code cấp thấp làm việc với giao thức mạng hoặc định dạng nhị phân.
  • Tối ưu hóa các phép tính nơi phép toán bit nhanh hơn số học thông thường.

Bẫy về độ ưu tiên toán tử

Trong hầu hết các ngôn ngữ lập trình, các toán tử bit &| có độ ưu tiên thấp hơn toán tử so sánh — vì vậy một biểu thức như if (a & b == c) thực ra được tính là a & (b == c), chứ không như tác giả thường mong muốn. Đây là một trong những nguyên nhân phổ biến nhất gây ra lỗi khó phát hiện khi làm việc với mặt nạ bit, và cách đáng tin cậy để tránh điều này là luôn đặt các phép toán bit trong dấu ngoặc rõ ràng.

Dùng thử công cụ