如何将int转换为位掩码?

时间:2009-11-02 17:12:27

标签: c# .net

有没有办法将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'));
}

如果不将其转换为比特币,会怎样?

5 个答案:

答案 0 :(得分:30)

int已经是位掩码。如果你想旋转这些位,你可以在int上自由使用按位运算符。如果您想将int转换为具有Flags属性的枚举,则只需使用简单的强制转换即可。

答案 1 :(得分:13)

找到它

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

答案 2 :(得分:5)

你可以构造一个bool[32]并循环遍历int中的所有位,用2 ^(循环计数器)屏蔽它并适当地设置数组中的bool

你确定你需要这个吗?大多数使用位掩码的操作都直接使用int。

要回答编辑中的问题:

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,并且在JITted时可能具有相同的性能特征,但我已经习惯了这种形式。

表示为类似宏的方法:

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

答案 3 :(得分:4)

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

答案 4 :(得分: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'));
}

大约相同数量的代码,性能差异可以忽略不计。但它可以让你强烈定义你的位值,你可以选择省略你不关心的BitFlags枚举中的位。