2012-09-19 7 views
12

के साथ क्यों किया जाता है यह एक आसान और सरल सवाल हो सकता है लेकिन मुझे अभी भी थोड़ा उलझन है कि क्यों bitwise OR का उपयोग करने का निर्णय लिया गया है। मान लें कि मैं एक वर्ग A है चार क्षेत्रों के साथ:क्यों झटके या ऑपरेटर का उपयोग ध्वज enum में अर्थ और

class A 
{ 
    private int Field1; 
    private static int Field2; 
    public int Field3; 
    public static int Field4; 
} 

और Reflection का उपयोग क्षेत्रों पाने के लिए:

var fields = typeof (A).GetFields(BindingFlags.Public | BindingFlags.Static); 

आप Reflection साथ नौसिखिया रहे हैं और कैसे BindingFlags, उपयोग करने के लिए जिस तरह से पता नहीं है आपके सिर में प्रारंभिक तर्क सोच होगी:

यह पंक्ति सभी स्थिर या सार्वजनिक फ़ील्ड का चयन करेगी क्योंकि bitwise या उपयोग किया जाता है। और उम्मीद परिणाम आपको लगता है:

Field2 
Field3 
Field4 

लेकिन जब F5 मार, परिणाम पूरी तरह से अलग हो जाएगा, बिटवाइज़ AND रूप OR काम करता है:

Field4 

बिटवाइज़ AND ऑपरेटर का प्रयोग क्यों नहीं है जिसके साथ पालन हो सकता है तर्क सोच इस तरह:

var fields = typeof (A).GetFields(BindingFlags.Public & BindingFlags.Static); 

मैं MSDN में शब्द पाया:

बिटवाइज़ या आपरेशन झंडे गठबंधन करने के लिए प्रयोग किया जाता है कि कुछ परिस्थितियों सरल कार्य के लिए आवश्यक नहीं किया जाना चाहिए में एक उन्नत अवधारणा पर विचार किया जा सकता है।

कृपया किसी अग्रिम अवधारणा यहाँ में सरल तरीके से समझने के लिए समझा सकता है?

+1

'या' समावेशी और अनन्य OR के बीच अंतर पर विचार करते समय 'OR 'सही अवधारणा प्रतीत होता है। इस मामले में 'OR' समावेशी है, जैसा कि "मुझे अंडे या हैम वाले स्टोर से कुछ आइटम उठाएं" कहें। यह कहने से अलग है कि "अंडे और हैम" होते हैं। –

+0

[एमएसडीएन] में (http://msdn.microsoft.com/en-us/library/6ztex2dc.aspx) आप पढ़ते हैं: आपको या तो बाइंडिंगफ्लैग निर्दिष्ट करना होगा। ** ** ** ** बाइंडिंगफ्लैग्स। स्टेटस रिटर्न पाने के लिए । तो हो सकता है कि आप एक ही समय में आवृत्ति ** और ** स्थैतिक सूची नहीं दे सकते ... ?? – tschmit007

+0

@ tschmit007: इस सवाल के साथ क्या करना है? –

उत्तर

25

संक्षिप्त सारांश के लिए अंत देखें।

लांग जवाब:

बिटवाइस या enum झंडे के टुकड़े के संयोजन है।

उदाहरण:

  • BindingFlags.Public 16 या 10000 (बाइनरी)
  • BindingFlags.Static 8 या 1000 (बाइनरी)

बिटवाइज़ का मूल्य है या निम्नलिखित की तरह इन को जोड़ती है के महत्व है :

10000 
01000 
-- 
11000 --> 24 

बिटवाइज और उन्हें पसंद करेंगे ई इस:

10000 
01000 
-- 
00000 --> 0 

झंडे का एक बहुत ही मूल अवधारणा है कि:
प्रत्येक मान, दो की एक शक्ति है जैसे:

  • 1 = 2^0
  • 2 = 2^1
  • 4 = 2^2
  • 8 = 2^3
  • आदि

उनकी बिट प्रतिनिधित्व हमेशा होता है एक 1 और बाकी शून्य :

decimal | binary 
1  | 0001 
2  | 0010 
4  | 0100 
8  | 1000 

बिटवाई का उपयोग करके उनमें से किसी एक को जोड़ना और हमेशा 0 पर ले जाएगा क्योंकि 1 एक ही स्थिति में नहीं है। बिटवाई और एक पूर्ण सूचना हानि का कारण बन जाएगा।

बिटवाइस दूसरी ओर या हमेशा एक स्पष्ट परिणाम का परिणाम देगा। उदाहरण के लिए, जब आपके पास (बाइनरी) 1010 (दशमलव 10) होता है तो आप जानते हैं कि यह मूल रूप से 8 और 2 रहा है। कोई अन्य संभावना नहीं बनाई जा सकती थी।
डिफ़ॉल्ट के रूप में कहा, विधि आप बुलाया बाद में यह जानकारी बिटवाइज़ AND ऑपरेटर का उपयोग कर निकाल सकते हैं:

if(10 & 8 == 8) // value 8 was set 

बिटवाइज़ या इस मामले में मूल रूप से विधि आप बुला रहे हैं करने के लिए मूल्यों को परिवहन के लिए एक वाहन है।
क्या इस विधि इन मूल्यों के साथ करता है बिटवाइज़ या के उपयोग के साथ कोई संबंध नहीं है।
यह internaly GetFields के लिए मामला है मैच के लिए सभी पारित कर झंडे की आवश्यकता होती है सकते हैं। लेकिन इसे मिलान करने के लिए पास किए गए झंडे में से केवल एक की आवश्यकता हो सकती है।

एक फोन करने वाले के रूप में

आप के लिए, निम्न बराबर होगा:

var requiredFlags = new List<BindingFlags>(); 
requiredFlags.Add(BindingFlags.Public); 
requiredFlags.Add(BindingFlags.Static); 
typeof (A).GetFields(requiredFlags); 

अब जब कि GetFields के रूप में संकलित नहीं है इस तरह के एक अधिभार प्रदान नहीं करता है, लेकिन अर्थ के समान ही होगा अपने कोड।

बातें संक्षेप में (टी एल; डीआर):

बिटवाइस और बूलियन कोई लेना देना नहीं है और
बिटवाइस है या बूलियन या

+1

जो ** बाद में ** '' '' ऑपरेटर के साथ 'if (userArgument & BindingFlags.Public) {/ * वापसी मूल्य में जोड़ें * /}' के रूप में उपयोग किया जाएगा। – Default

2

साथ कोई संबंध नहीं है झंडा enum किया जा रहा है बूलियन स्थितियों के एक सेट का प्रतिनिधित्व करने के लिए।

अपने उदाहरण में, प्रत्येक बूलियन हालत के लिए संगत फ़ील्ड वापस करने पूरा किया जाना चाहिए।

करें enums बस अभिन्न मान कि anding और oring के लिए हमेशा की तरह द्विआधारी नियमों का पालन तो कई बिट्स आप चाहिए या एक साथ मूल्यों उन बिट्स का प्रतिनिधित्व स्थापित करने के लिए कर रहे हैं।

एक बार ऐसा करने के बाद, आप उचित बिट्स सेट के साथ एक झंडा enum है।

आपकी समस्या यह है कि आप दो अलग-अलग अवधारणाओं को भंग कर रहे हैं: जिस तरह से आप ध्वज enum के लिए बुलियन स्थितियों के सेट का निर्माण करते हैं, वह एक अवधारणा है। जिस तरह से ध्वज enum का उपयोग किया जाता है (या यह क्या दर्शाता है) एक अलग अवधारणा है।

पूर्व उपयोग या बुलियन स्थितियों के सेट का निर्माण करने के लिए। उत्तरार्द्ध कहता है कि प्रत्येक बिट एक बूलियन स्थिति का प्रतिनिधित्व करता है जिसे पूरा किया जाना चाहिए।

1

गेटफिल्ड्स() के कार्यान्वयनकर्ता को विभिन्न ऑर्ड फ़्लैग के संयोजन के रूप में चुना गया है और चयनित मानदंडों का संयोजन है।

जो समझ में आता है क्योंकि आप अतिरिक्त फ़िल्टर नहीं चाहते हैं तो आप हमेशा एक मानदंड छोड़ सकते हैं।

संबंधित मुद्दे