ลำดับความสำคัญและการดำเนินการ bitmask


94

ฉันเจอเคสที่แปลกมาก (ดูเหมือน)

ใช้หมายเลข 2 ( 0b10) และ bitmask ด้วย 1 ( 0b01)

สิ่งนี้ควรสร้าง0b00ซึ่งเทียบเท่ากับ 0

อย่างไรก็ตามนี่คือสิ่งที่ Mr Schrödingerเข้ามา:

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

เหล้าวิสกี้. แทงโก้. ฟ็อกซ์ทรอต

ฉันยอมรับว่าไม่ใช่คนที่คมที่สุดเมื่อพูดถึงตัวดำเนินการระดับบิต - ดังนั้นฉันอาจจะผิดพลาดอย่างน่ากลัวตรงไหน

อย่างไรก็ตามใน Python:

0b10 & 0b01 == 0 = True

0b10 & 0b01 != 0 = False

...ดังนั้น?


ฉันไม่ได้ใช้ PHP แต่เป็นภาษา C, C ++ คุณสามารถเขียนเป็นvar_dump(!(0b10 & 0b01))
Grijesh Chauhan

2
สิ่งที่แปลกกว่า: 0b0+1ประเมินเป็น2ในบางเวอร์ชันเนื่องจากข้อบกพร่องของโปรแกรมแยกวิเคราะห์
Lily Chung

คำตอบ:


150

คุณกำลังทำสิ่งนี้จริง:

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

ลอง:

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

6
สำหรับฉันแล้วดูเหมือนว่า PHP มีลำดับความสำคัญของตัวดำเนินการโดยรวม
Alvin Wong

23
ฉันเดาว่านั่นเป็นเหตุผลที่ฉันไม่เคยพึ่งพาความมีอำนาจเหนือกว่าในภาษาใด ยิ่งไปกว่านั้นฉันคิดว่าวงเล็บทำให้โค้ดอ่านง่ายขึ้น ในกรณีที่รุนแรงคุณอาจต้องการ (จัดกลุ่มใหม่) และแสดงความคิดเห็นสั้น ๆ
ไม่มีคำตอบ

2
@AlvinWong คุณถูกต้อง! ฉันคิดว่ารหัสแทบจะไม่จำเป็นต้องมีการแสดงออกตามเงื่อนไขเช่น0b10 & (0b01 == 0)ทำไมบางคนถึงใช้ข้อมูลแบบ bitwise ด้วยใช่ไม่ใช่
Grijesh Chauhan

4
ลองพิจารณาตัวอย่างทั่วไป: ตัวดำเนินการ ternary PHP มีการย้อนกลับทำให้แตกต่างจากภาษาอื่น ๆ ทั้งหมด Ref: phpsadness
Alvin Wong

5
นั่นเป็นเหตุผลที่คน C และ C ++ มีคำเตือนสำหรับสิ่งเหล่านี้
PlasmaHH
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.