2010-09-10 14 views
6

मेरे पास एक सिस्टम है। चयन। बिटएरे ऐरे (~ 3000 आइटम) और मैं सभी बिट्स को बाईं ओर 1 तक स्थानांतरित करना चाहता हूं। हालांकि संग्रह उस ऑपरेशन का समर्थन नहीं करता है (यानी बिटएरे < < 1 काम नहीं कर रहा है और कोई विधि नहीं है)। ऐसा करने के बारे में कोई विचार है?बिटअरे - शिफ्ट बिट्स

धन्यवाद!

उत्तर

4

यह सरल स्निपेट इसे करने का मैन्युअल तरीका दिखाता है। bitArray[0] का मूल्य ओवरराइट है:

//... bitArray is the BitArray instance 

for (int i = 1; i < bitArray.Count; i++) 
{ 
    bitArray[i - 1] = bitArray[i]; 
} 

bitArray[bitArray.Count - 1] = false // or true, whatever you want to shift in 

बनाना इस एक विस्तार विधि एक बड़ी बात नहीं होना चाहिए।

+2

वह महान ... लेकिन धीमा। हालांकि हम एक विशेष ऑपरेटर या विधि होंगे क्योंकि हम बिट्स के साथ खेल रहे हैं। – Martin

+0

आप सामग्री को अपने 'बिटअरे' से 'बूल []' में कॉपी करने और ऑफ़सेट का उपयोग करके डेटा को अन्य 'बूल []' पर कॉपी करने का लंबा रास्ता तय कर सकते हैं। अंत में आप परिणामस्वरूप 'बूल []' से अपने 'बिटअरे' को फिर से बना सकते हैं। लेकिन मुझे संदेह है कि यह आपके ~ 3000 बिट्स के लिए प्रत्येक तत्व तक पहुंचने से तेज़ होगा। –

0

मेरे सिर के शीर्ष के लिए सबसे आसान तरीका यह है कि बिटरएरे को बिगइन्ट या इसी तरह की संरचना में परिवर्तित करना है जो बिटवाइफ्ट स्थानांतरण और पीछे का समर्थन करता है। अब, नेट 4 में अंतर्निहित बिगइन्टर मुझे लगता है कि स्थानांतरण के समर्थन में सहायता नहीं करता है, लेकिन ऐसे कुछ भी हैं जो मोनो के कार्यान्वयन की तरह करते हैं।

2

सिस्टम.Numerics.BigInteger वास्तव में बिट स्थानांतरण का समर्थन करता है।

+1

एक चेतावनी के साथ: "पूर्णांक प्राइमेटिव के साथ बिटवाई बाएं-शिफ्ट ऑपरेशन के विपरीत, वामशफ्ट विधि मूल बिगइंटर मूल्य के संकेत को सुरक्षित रखती है।" तो (-3 << 30)! = ((बिगइंटर) (- 3) << 30) – FarmerBob

+0

और इसका कारण BigInteger प्रकार हस्ताक्षरित है। – detay

1

मुझे यकीन है कि नहीं कर रहा हूँ कैसे दक्षता के बारे में है, लेकिन इस विस्तार विधि काम

public static BitArray ShiftRight(this BitArray instance) 
{ 
    return new BitArray(new bool[] { false }.Concat(instance.Cast<bool>().Take(instance.Length - 1)).ToArray()); 
} 
+1

ओपी ने एक शिफ्ट के लिए कहा। मुझे यह पसंद आया, इसलिए यहां एक शिफ्ट बाएं संस्करण है: नया बिटाएरे ( (उदाहरण। कैस्ट ()। वापसी करें (उदाहरण। लम्बाई - 1)। टोएरे())। कंसट (नया बूल [] {newState}) .ToArray() ); वास्तव में – xgo

+0

। धन्यवाद :) – eye

0

बहलाना एक आवरण के रूप में अपने आप को bitarray करता है चारों ओर ulong[]; 64 से कम संख्या में बिट्सफिफ्ट को कार्यान्वित करना इस तरह के केक का एक टुकड़ा है और इसमें कम समय लगेगा और अन्य सुझाए गए दृष्टिकोणों की तुलना में कम ध्रुवीय भालू को मार डालेगा। "बिट्स जो अंत में गिर जाएंगे" से सावधान रहें, यदि आप उन्हें रखना चाहते हैं तो आपको सरणी बढ़ाना पड़ सकता है (या नहीं, अगर वे शून्य हैं और आप कहते हैं कि गैर-मौजूद तत्व शून्य से शून्य पकड़ता है)।

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