2.4.7 Thao tác với bit đơn lẻ (2)

Bây giờ chúng tôi sẽ chỉ thêm cho bạn một ví dụ về sự khác biệt giữa các toán tử logic và các toán tử bit. Giả sử rằng khai báo sau đã được thực hiện:

int i = 15, j = 22;

Giả sử rằng các biến int lưu trữ 32 bit, biểu diễn bitwise của hai biến sẽ như sau →

i: 00000000000000000000000000000111

j: 00000000000000000000000000010110

Bây giờ nếu khai báo như sau →

int log = i && j;

thì đây là một phép toán logic. Chúng ta hãy xem quá trình tính toán của phép toán này. Cả hai biến i và j đều khác 0 tức là tính theo logic thì cả hai đều là “true”. Nếu chúng ta tra bảng chân lý của toán tử && thì sẽ thấy rằng kết quả là “true”, nó là một số nguyên có giá trị 1. Có nghĩa là giá trị bitwise của biến log sẽ như sau:

log: 00000000000000000000000000000001

Còn đây sẽ là phép toán bit →

int bit = i & j;

Toán từ & sẽ hoạt động trên mỗi cặp bit tương ứng riêng biệt. Đây là kết quả:

bit: 00000000000000000000000000000110

Giá trị của bit tương đương với biến nguyên có giá trị 6.

Giờ hãy xem đến toán tử phủ định. Đầu tiên là toán tử logic →

int logneg = !i;

Biến logneq sẽ được set về 0, giá trị bitwise của nó sẽ toàn là 0.

logneq: 00000000000000000000000000000000

Phép toán phủ định bit sẽ như sau →

int bitneg = ~i;

Giá trị của bitneq sẽ là -16, ảo diệu không ? Câu trả lời là không, điều này hoàn toàn bình thường.

bitneq: 11111111111111111111111111110000