2010-07-12 16 views
5

का उपयोग कर रहा सी # में बिटमैप संचालन के साथ एक छोटे से मदद की जरूरत हैबिट हेरफेर एक मुखौटा

मैं एक UInt16 ले, बिट्स की एक मनमाना संख्या को अलग, और एक अन्य UInt16 मूल्य का उपयोग कर उन्हें सेट करना चाहते हैं।

उदाहरण:

10101010 -- Original Value 
00001100 -- Mask - Isolates bits 2 and 3 

Input  Output 
00000000 -- 10100010 
00000100 -- 10100110 
00001000 -- 10101010 
00001100 -- 10101110 
       ^^ 

उत्तर

8

ऐसा लगता है कि आप की तरह हैं:

(orig & ~mask) | (input & mask) 

पहली छमाही शून्यों orig जो mask में हैं के टुकड़े। फिर आप थोड़ा सा करते हैं या input से बिट्स के खिलाफ mask में हैं।

4
newValue = (originalValue & ~mask) | (inputValue & mask); 

originalValue -> 10101010 
inputValue -> 00001000 
mask   -> 00001100 
~mask   -> 11110011 

(originalValue & ~mask) 
    10101010 
& 11110011 
---------- 
    10100010 
     ^^ 
     Cleared isolated bits from the original value 

(inputValue & mask) 
    00001000 
& 00001100 
---------- 
    00001000 


newValue =  
    10100010 
| 00001000 
---------- 
    10101010 
1

ऐसा कुछ?

static ushort Transform(ushort value){ 
    return (ushort)(value & 0x0C/*00001100*/ | 0xA2/*10100010*/); 
} 

यह आपके नमूना आउटपुट में आपके सभी नमूना इनपुट को परिवर्तित करेगा। अधिक सामान्य होने के लिए, आप कुछ इस तरह चाहते हैं:

static ushort Transform(ushort input, ushort mask, ushort bitsToSet){ 
    return (ushort)(input & mask | bitsToSet & ~mask); 
} 

और आप के साथ इस कहेंगे:

Transform(input, 0x0C, 0xA2); 

पहले समारोह के बराबर व्यवहार के लिए।

1

terser समाधान की एक संख्या यहाँ, प्रशंसनीय देखने के लिए विशेष रूप से जे एस बैंग्स 'है, लेकिन भूल नहीं है आप भी System.Collections नाम स्थान में उपयोग करने के लिए एक आसान BitArray संग्रह है: http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx

+0

मैं इस करार दिया, लेकिन यह एक मास्किंग क्षमता प्रतीत नहीं होता है। मुझे प्रत्येक बिट को अलग-अलग सेट करने या प्राप्त करने की आवश्यकता होगी। –

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