Cuối cùng, mã này đang kiểm tra xem một bit (cờ FCTRL) có được bật trong biến số uop->flags
hay không.
Nhưng đây là một số giải thích:
Mặc nhiên, các mã if(X)
kiểm tra cho X là một giá trị "true". Đối với số nguyên, 0 là giá trị "false" duy nhất và mọi thứ khác là "true".
Do đó mã của bạn là tương đương với:
if (0 != (uop->flags & FCTRL))
Bây giờ, có nghĩa là gì?
Toán tử &
thực hiện "bitwise AND", nghĩa là mỗi bit của cạnh bên trái là ANDed với bit tương ứng ở phía bên tay phải.
Vì vậy, nếu chúng tôi đã viết ra hai toán hạng của chúng tôi ở dạng nhị phân:
uop->flags 1010 1010 (example)
FCTRL 0100 0000
Trong ví dụ này, nếu bạn thực hiện một "VÀ" trên mỗi cặp bit, bạn sẽ có được kết quả:
result 0000 0000
Đánh giá sai, và thực sự trong ví dụ đó giá trị uop->flags
không có cờ FCTRL được đặt.
Bây giờ đây là một ví dụ khác, nơi lá cờ là thiết lập:
uop->flags 1110 1010 (example)
FCTRL 0100 0000
Kết quả ANDed tương ứng:
result 0100 0000
Kết quả này không phải là zero, do đó "true", kích hoạt của bạn if
tuyên bố.
uop-> flags = 0x140 => là điều kiện đúng không? – mahmood
có bởi vì kết quả của 0x140 & 0x040 là 0x040. – Lou
Xem http://en.wikipedia.org/wiki/Bitwise_operation để biết thêm chi tiết về các thao tác bitwise. – Lou