Các hoạt động ưu tiên và bitmask


94

Tôi đã gặp một trường hợp (dường như) rất kỳ lạ.

Lấy số 2 ( 0b10) và bitmask nó với 1 ( 0b01)

Điều này sẽ tạo ra 0b00tương đương với 0.

Tuy nhiên, đây là nơi ông Schrödinger đến:

var_dump(0b10 & 0b01); // int(0)
var_dump(0b10 & 0b01 == 0); // int(0)
var_dump(0b10 & 0b01 != 0); // int(0)

Whisky. Tango. Foxtrot.

Phải thừa nhận rằng tôi không phải là người nhạy bén nhất khi nói đến các toán tử bitwise - vì vậy có lẽ tôi đã mắc sai lầm kinh khủng, khủng khiếp ở đâu đó?

Tuy nhiên, trong Python:

0b10 & 0b01 == 0 = True

0b10 & 0b01 != 0 = False

...vì thế?


Tôi không trong PHP nhưng trong C, C ++ bạn chỉ có thể viết nhưvar_dump(!(0b10 & 0b01))
Grijesh Chauhan

2
Mặc dù vậy, có điều gì đó kỳ lạ hơn: được 0b0+1đánh giá là 2trong một số phiên bản, do lỗi phân tích cú pháp.
Lily Chung

Câu trả lời:


150

Bạn thực sự đang làm điều này:

var_dump(0b10 & (0b01 == 0));
var_dump(0b10 & (0b01 != 0));

Thử:

var_dump((0b10 & 0b01) == 0);
var_dump((0b10 & 0b01) != 0);

6
Có vẻ với tôi rằng PHP có quyền ưu tiên toán tử strnage nói chung.
Alvin Wong

23
Tôi đoán đó là lý do tại sao tôi KHÔNG BAO GIỜ dựa vào sự ưu việt trong bất kỳ ngôn ngữ nào. Hơn nữa, tôi nghĩ rằng dấu ngoặc đơn làm cho mã dễ đọc hơn. Trong những trường hợp cực đoan, bạn có thể muốn (lại) nhóm và nhận xét ngắn nội dung.
Không có câu trả lời

2
@AlvinWong Bạn nói đúng! Tôi nghĩ hiếm khi mã cần biểu thức điều kiện như 0b10 & (0b01 == 0)tại sao ai đó lại áp dụng bitwise với loại thông tin có.
Grijesh Chauhan

4
Vâng, hãy xem xét một ví dụ phổ biến hơn: toán tử bậc ba, PHP có nó ngược lại, làm cho nó khác với tất cả các ngôn ngữ khác. Tham khảo: phpsadness
Alvin Wong

5
Đó là lý do tại sao trong C và C ++ mọi người có cảnh báo cho những điều này.
PlasmaHH
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.