有没有办法将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'));
}
如果不将其转换为比特币,会怎样?
答案 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枚举中的位。