如何将int转换为位掩码?

Bor*_*ens 12 .net c#

有没有办法将int转换为位掩码?

例:

int i = 33;
Run Code Online (Sandbox Code Playgroud)

应转换为(不确定数据类型)

bool[] bitmask = new[] {true, false, false, false, false, true};
Run Code Online (Sandbox Code Playgroud)

更新
对大多数答案的反应:

我需要这样做:

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'));
}
Run Code Online (Sandbox Code Playgroud)

如果不将其转换为比特阵列,情况会怎样?

JSB*_*ոգչ 30

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

  • 如果你需要访问第i位(我是0索引),使用`1 << i`. (3认同)

Bor*_*ens 13

找到了

BitArray bits = new BitArray(System.BitConverter.GetBytes(showGroup.Value));
Run Code Online (Sandbox Code Playgroud)

  • SO上有一个例子:http://stackoverflow.com/questions/8447/enum-flags-attribute (2认同)

Mic*_*tta 5

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

你确定你需要这个吗?大多数使用位掩码的操作都直接使用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'));
    }
}
Run Code Online (Sandbox Code Playgroud)

打印:

01  
02  
06 
Run Code Online (Sandbox Code Playgroud)

如果你不习惯算术,那么这不是最明显的解决方案,是的.使用2 ^(位索引)屏蔽整数值中的每个位,如果结果值大于零(表示该索引处的位已设置),则执行某些操作. 1 << i(左移)相当于2^i,并且一旦JITted可能具有相同的性能特征,但我习惯于这种形式.

表示为类似宏的方法:

bool IsSet(int val, int index)
{
    return (( (1 << (index-1)) & val) > 0);
}
Run Code Online (Sandbox Code Playgroud)