有没有办法将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属性的枚举,则只需使用简单的强制转换即可.
Bor*_*ens 13
找到了
BitArray bits = new BitArray(System.BitConverter.GetBytes(showGroup.Value));
Run Code Online (Sandbox Code Playgroud)
你可以构造一个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)
| 归档时间: |
|
| 查看次数: |
16241 次 |
| 最近记录: |