2009-11-02 106 views
11

有沒有辦法將int轉換爲位掩碼?如何將int轉換爲位掩碼?

例如:

int i = 33; 

應轉換爲(不知道的數據類型)

bool[] bitmask = new[] {true, false, false, false, false, true}; 

更新
在反應最答案:

我需要做的這個:

BitArray bits = new BitArray(BitConverter.GetBytes(showGroup.Value)); 
List<String> showStrings = new List<string>(); 
for (int i = 0; i < bits.Length; i++) 
{ 
    if(bits[i]) 
     showStrings.Add((i+1).ToString().PadLeft(2, '0')); 
} 

如果沒有把它轉換成一個bitarray會怎麼樣呢?

回答

28

一個int已經是一個位掩碼。如果你想旋轉位,你可以在整數上自由使用位運算符。如果您想將int轉換爲具有Flags屬性的枚舉,則只需簡單的強制轉換即可。

+3

如果你需要訪問第i位(我是0索引),使用'1 << i'。 – Brian 2009-11-02 17:52:08

+0

我會檢查一下。謝謝:) – 2009-11-03 07:42:33

5

你可以通過構建所有比特的bool[32]和環在int,具有2 ^(循環計數器)掩蔽,並在陣列中適當地設置bool秒。

你確定你需要這個嗎?大多數使用位掩碼的操作都直接使用整數。

要回答這個問題在你編輯:

int val = 35; 
List<string> showStrings = new List<string>(); 
for (int i = 0; i < 32; i++) 
{ 
    if (((1 << i) & val) > 0) 
    { 
     showStrings.Add((i + 1).ToString().PadLeft(2, '0')); 
    } 
} 

打印:

01 
02 
06 

若你不習慣位算術最明顯的解決方案,真實。用2 ^(比特索引)掩碼整數值中的每一位,如果結果值大於零(表示該索引處的位被設置),則執行一些操作。 1 << i(左移)相當於2^i,並且在打開JIT後可能具有相同的性能特徵,但我習慣於這種形式。

表現爲宏觀樣方法:

bool IsSet(int val, int index) 
{ 
    return (((1 << (index-1)) & val) > 0); 
} 
12

發現

BitArray bits = new BitArray(System.BitConverter.GetBytes(showGroup.Value)); 
+0

你可能會發現@JS Bangs建議的in方法會更快。 – Kieron 2009-11-02 17:18:15

+0

嗯,這是一個很小的轉換,它幾乎沒有關係。但爲了正確的緣故,我很樂意學習:) – 2009-11-02 17:22:31

+2

有一個SO的例子:http://stackoverflow.com/questions/8447/enum-flags-attribute – Groo 2009-11-02 17:23:56

3
int val = 33; 
var bitarray = new BitArray(new[] { val }); 
var att = bitarray.Cast<bool>().ToArray(); 
+0

我喜歡這個。對於那些感興趣的,Cast方法是一個擴展方法,並且需要「使用System.Linq」聲明,它在Mono下需要引用System.Core – 2013-02-10 15:51:44

2

既然你這麼問,這裏是不使用BitArray的解決方案:

// First define a bitmask enum for the bits you are interested in 
[Flags] 
public enum BitFlags 
{ 
    Flag1 = 1, 
    Flag2 = 2, 
    Flag3 = 4, 
    Flag4 = 8, 
    Flag5 = 16 
    // ... 
} 

int index = 0; 
List<string> showStrings = new List<string>(); 
foreach(int flag in Enum.GetValues(typeof(BitFlags))cast<int>()) 
{ 
    index += 1; 
    if ((input & flag) == flag) 
    showStrings.Add(index.ToString().PadLeft(2, '0')); 
} 

它的代碼量相當,negligib樂的表現差異。但它確實可以讓你強烈定義你的位值,你可以選擇省略你不關心的BitFlags枚舉中的位。

+0

謝謝。我不知道這是可能的。另一個工具在我的腰帶:) – 2009-11-03 08:05:23