2010-07-12 41 views
5

tôi cần một chút giúp đỡ với các hoạt động bitmap trong C#Bit thao tác trong C# sử dụng một mặt nạ

Tôi muốn để có một UInt16, cô lập một số tùy ý của các bit, và đặt chúng sử dụng giá trị khác UInt16.

Ví dụ:

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

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

Trả lời

8

Nó có vẻ như bạn muốn:

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

Các zero nửa đầu các bit của orig mà là trong mask. Sau đó, bạn thực hiện HOẶC bitwise so với các bit từ input có trong 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

Một cái gì đó như thế này?

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

Điều này sẽ chuyển đổi tất cả các đầu vào mẫu của bạn thành đầu ra mẫu. Để trở thành tổng quát hơn, bạn muốn một cái gì đó như thế này:

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

Và bạn sẽ gọi này với:

Transform(input, 0x0C, 0xA2); 

Đối với hành vi tương đương với chức năng đầu tiên.

1

Một số trong những giải pháp terser đây trông đáng tin cậy, đặc biệt là JS Bangs', nhưng đừng quên rằng bạn cũng có một bộ sưu tập BitArray tiện để sử dụng trong System.Collections namespace: http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx

+0

tôi coi điều này, nhưng nó dường như không có khả năng che chắn. Nó sẽ yêu cầu tôi thiết lập hoặc nhận từng bit riêng lẻ. –

Các vấn đề liên quan