2012-02-07 12 views
13

मैं बिट मास्क और बिटवाईज बूलियन ऑपरेशंस (एक्सओआर/एनओआर/ओआर/एंड/नोट/ईक्यूवी/आदि) के साथ काम करने के ऑपरेटर आधारित तरीके की तलाश में हूं। आम तौर पर मैं वास्तव में एक विस्तार विधि शैली दृष्टिकोण की तरह है, लेकिन इस मामले में, मुझे थोड़ा गन्दा लगता है।बिटअरे और एक्सओआर

क्या सी # में बिट्स के साथ काम करने का एक छोटा रास्ता है?

 BitArray a = new BitArray(0x001); 
     BitArray b = new BitArray(0x100); 
     BitArray c = new BitArray(0x010); 

     BitArray test = a | b; // won't compile 
     BitArray test2 = a^c; // won't compile 

     BitArray test3 = a.Or(b); // compiles 
     BitArray test4 = a.Xor(c); // compiles 
+3

क्यों न केवल इंट्स पर काम करते हैं? int एक = 0x001; int बी = 0x100; int परीक्षण = ए | ख; बस ठीक काम करता है। –

+9

मुझे नहीं लगता [निर्माता जो 'int' लेता है] (http://msdn.microsoft.com/en-us/library/4ty2t3fx.aspx) जो आपको लगता है वह करता है। – svick

+0

@RobertRouhani यह इस विशिष्ट उदाहरण के लिए काम करता है, लेकिन बिट्स की मनमानी संख्या के बारे में क्या है? उदाहरण के लिए, आपको 96 बिट पूर्णांक के लिए एक अलग संरचना होनी होगी। – annonymously

उत्तर

20

BitArray के साथ सीधे इसे करने का कोई तरीका नहीं है - लेकिन आप हमेशा एक रैपर वर्ग बना सकते हैं जिसमें BitArray है, और वहां अपने स्वयं के ऑपरेटरों को परिभाषित करें।

बेशक

, अगर आप 64 बिट्स या इससे कम साथ काम कर रहे, तो आप सिर्फ इस्तेमाल कर सकते हैं एक long या ulong और इसके साथ किया जा ...

+0

या 32 बिट्स तक नीचे, बस 'बिटवॉक्टर 32' का उपयोग करें :) – leppie

+0

@leppie यदि यह 32 बिट्स है, तो सबसे आसान तरीका मानक' int' या 'uint' – annonymously

+0

@ अनामिक रूप से उपयोग करना होगा: यदि आप बिट्स नहीं जानते हैं। शुरुआत के लिए, बिटवॉक्टर 32 आसान होगा, विशेष रूप से मास्क से निपटने के दौरान, – leppie

6

दुर्भाग्य से, के बाद से वहाँ कोई विस्तार कक्षाओं में अधिक भार (ऑपरेटर अधिभार वर्ग में परिभाषित या खुद struct किया जाना है) ऑपरेटर है, वहाँ ऑपरेटरों में उन तरीकों के अनुवाद का कोई वास्तविक तरीका है। मुझे उम्मीद है (जैसा कि मुझे यकीन है कि कई अन्य भी करते हैं) कि भविष्य में यह बदल दिया जाएगा, लेकिन अभी इसके लिए ऐसा करने का कोई तरीका नहीं है।

12

वहाँ BitArray के साथ और एक के लिए ऐसा करने का कोई तरीका नहीं है अच्छा कारण: Or या Xorजैसे ऑपरेशंस पहले ऑपरेंड को संशोधित करते हैं। यह | या ^ आमतौर पर नहीं करता है।

यदि आप चाहते थे, तो आप ऑपरेटर करने से पहले पहले ऑपरेंड के मूल्य की प्रतिलिपि बनाते हुए एक रैपर बना सकते थे जिसमें ऑपरेटर थे।

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