क्या करता है | = (एकल पाइप बराबर) और = (एकल एम्पर्सैंड समान) का मतलब है


116

नीचे की पंक्तियों में:

//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 # में मतलब है
कि मैं दूसरों को रखने के साथ सिस्टम विशेषता को निकालना चाहता हूं ...

जवाबों:


149

वे यौगिक असाइनमेंट ऑपरेटर हैं, अनुवाद कर रहे हैं (बहुत शिथिल)

x |= y;

में

x = x | y;

और उसी के लिए &। एक निहित कास्ट के बारे में कुछ मामलों में थोड़ा और विस्तार है, और लक्ष्य चर का केवल एक बार मूल्यांकन किया जाता है, लेकिन यह मूल रूप से इसका सार है।

गैर-यौगिक ऑपरेटरों के संदर्भ में, &एक बिटवाइज़ "AND" है और |बिटवाइज़ "OR" है

EDIT: इस मामले में आप चाहते हैं Folder.Attributes &= ~FileAttributes.System। समझने के लिए क्यों:

  • ~FileAttributes.Systemमतलब "सभी विशेषताओं को छोड़कर System " ( ~एक बिटवाइज़-नहीं है)
  • & इसका मतलब है "परिणाम सभी विशेषताएं हैं जो ओपेरा के दोनों किनारों पर होती हैं"

तो यह मूल रूप से एक मुखौटा के रूप में कार्य कर रहा है - केवल उन विशेषताओं को बनाए रखें जो ("सिस्टम को छोड़कर सब कुछ") में दिखाई देती हैं। सामान्य रूप में:

  • |=केवल कभी लक्ष्य में बिट्स जोड़ देगा
  • &=केवल कभी लक्ष्य से बिट्स निकाल देंगे

2
x = x | (y);इसका वर्णन करने का एक बेहतर तरीका है क्योंकि यह x |= y + z;समान नहीं हैx = x | y + z;
IronMensan

उत्तर के लिए धन्यवाद / लेकिन मेरे उद्देश्य (सिस्टम विशेषता को हटाने) के लिए जिसे मुझे उपयोग करना चाहिए (= = या & =)?
सिल्वरलाइट

1
@ लॉस्टलॉर्ड:Folder.Attributes &= ~FileAttributes.System;
जॉर्ज डकेट

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 इसे शॉर्ट-सर्किट मूल्यांकन कहा जाता है, देखें en.wikipedia.org/wiki/Short-circuit_evaluation
पोल्क्स

@Polluks तो a |= bवास्तव में मूल रूप से मतलब है a = a || b?
रेशमकीट

@silkfire हां, लेकिन एक पाइप और दो पाइप को इंटरचेंज न करें।
पोल्क्स

3

मैं दूसरों को रखने के साथ सिस्टम विशेषता को निकालना चाहता हूं।

आप ऐसा कर सकते हैं:

Folder.Attributes ^= FileAttributes.System;

1
मुझे लगता है कि आप इसके लिए एक और के बजाय एक XOR का उपयोग करना चाहते हैं।
GameZelda 13

थोड़ा उलझन में / ~ आवश्यक है या नहीं
सिल्वरलाइट

@LostLord दो तरीकों के अनुरूप हैं जहाँ तक मुझे पता है
क्रिस एस

@ क्रिस ^= bitथोड़ा सेट करेगा यदि यह पहले से सेट नहीं था, तो इसे सेट &= ~bitनहीं करता है।
क्रॉनिकल

आप निश्चित रूप से एक xor का उपयोग नहीं करना चाहते हैं। अगर यह चला गया था तो इसे वापस रख दिया जाएगा।
जॉन लॉर्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.