อะไร | = (ท่อเดียวเท่ากับ) และ & = (เครื่องหมายเดียวและเท่ากับ) หมายถึงอะไร


118

ในบรรทัดด้านล่าง:

//Folder.Attributes = FileAttributes.Directory | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly;
Folder.Attributes |= FileAttributes.Directory | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly;


Folder.Attributes |= ~FileAttributes.System;
Folder.Attributes &= ~FileAttributes.System;

อะไร|=(ท่อเดียวเท่ากับ) และ&=(เดี่ยวเครื่องหมายเท่ากับ) เฉลี่ยใน C #
ฉันต้องการลบแอตทริบิวต์ระบบที่มีการรักษาคนอื่น ๆ ...

คำตอบ:


151

พวกเขาเป็นตัวดำเนินการกำหนดแบบผสมการแปล (หลวมมาก)

x |= y;

เป็น

x = x | y;

และเช่นเดียวกันสำหรับ&. มีรายละเอียดเพิ่มเติมเล็กน้อยในบางกรณีเกี่ยวกับการร่ายโดยนัยและตัวแปรเป้าหมายจะได้รับการประเมินเพียงครั้งเดียว แต่โดยพื้นฐานแล้วเป็นส่วนสำคัญของมัน

ในแง่ของผู้ประกอบการที่ไม่ใช่สารประกอบ&เป็นค่าที่เหมาะสม "และ"และ|เป็นค่าที่เหมาะสม "หรือ"

แก้ไข: Folder.Attributes &= ~FileAttributes.Systemในกรณีนี้คุณต้องการ เพื่อทำความเข้าใจว่าทำไม:

  • ~FileAttributes.Systemหมายถึง "แอตทริบิวต์ทั้งหมดยกเว้น System " ( ~เป็นบิต - ไม่ใช่)
  • & หมายความว่า "ผลลัพธ์คือแอตทริบิวต์ทั้งหมดที่เกิดขึ้นทั้งสองด้านของตัวถูกดำเนินการ"

ดังนั้นโดยทั่วไปแล้วจะทำหน้าที่เป็นหน้ากาก - เก็บเฉพาะแอตทริบิวต์ที่ปรากฏใน ("ทุกอย่างยกเว้นระบบ") โดยทั่วไป:

  • |=จะเพิ่มบิตให้กับเป้าหมายเท่านั้น
  • &=จะลบบิตออกจากเป้าหมายเท่านั้น

2
x = x | (y);เป็นวิธีที่ดีกว่าในการอธิบายเพราะx |= y + z;ไม่เหมือนกับx = x | y + z;
IronMensan

ขอบคุณสำหรับคำตอบ / แต่สำหรับจุดประสงค์ของฉัน (ลบคุณสมบัติระบบ) ฉันควรใช้อันไหน (| = หรือ & =)
SilverLight

1
@LostLord:Folder.Attributes &= ~FileAttributes.System;
George Duckett

33

a |= bเทียบเท่ากับa = a | bยกเว้นที่aได้รับการประเมินเพียงครั้งเดียว
a &= bจะเทียบเท่ากับa = a & bยกเว้นที่aได้รับการประเมินเพียงครั้งเดียว

ในการลบบิตระบบโดยไม่ต้องเปลี่ยนบิตอื่นให้ใช้

Folder.Attributes &= ~FileAttributes.System;

~เป็นการปฏิเสธระดับบิต คุณจะตั้งค่าบิตทั้งหมดเป็น 1 ยกเว้นบิตระบบ andเมื่อใช้มาสก์จะตั้งค่าระบบเป็น 0 และปล่อยให้บิตอื่น ๆ ทั้งหมดไม่เสียหายเพราะ0 & x = 0และ1 & x = xสำหรับสิ่งใด ๆx


1
aมีการประเมินเพียงครั้งเดียวหมายความว่าอย่างไร? จะประเมินหลายครั้งกว่านั้นทำไม
silkfire

@silkfire สิ่งนี้เรียกว่าการประเมินการลัดวงจรโปรดดูที่en.wikipedia.org/wiki/Short-circuit_evaluation
Polluks

@Polluks โดยพื้นฐานa |= bแล้วหมายถึงa = a || bอะไร?
ผ้าไหม

@silkfire ใช่ แต่อย่าเปลี่ยนท่อเดียวกับสองท่อ
Polluks

3

ฉันต้องการลบแอตทริบิวต์ของระบบโดยเก็บข้อมูลอื่น ๆ ไว้ ..

คุณสามารถทำได้ดังนี้:

Folder.Attributes ^= FileAttributes.System;

1
ฉันคิดว่าคุณต้องการใช้ XOR แทน AND สำหรับสิ่งนี้
GameZelda

สับสนนิดหน่อย / ~ จำเป็นหรือไม่
SilverLight

@LostLord สองวิธีนี้คล้ายคลึงกันเท่าที่ฉันทราบ
Chris S

@ChrisS ^= bitจะตั้งค่าบิตหากยังไม่ได้ตั้งค่า&= ~bitไม่ได้ตั้งค่า
พงศาวดาร

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