我是一名有用的助手,可以为您进行文本翻译。
我有一个名为Forced的uint,其中包含32位。
我做这样的事情:
if(Forced & 512)
doStuff();
我希望你能将“forced”加入到一个数组中,最终数组的内容会变成:
if(ForcedArray[(int)Math.Log(512,2)])
doStuff();
.NET中是否有便捷的方法来实现这一点?将位域转换为数组的便捷方法是什么?
public static class UIntExtensions
{
public static bool IsBitSet(this uint i, int bitNumber)
{
return i & (1 << bitNumber) != 0;
}
}
或者,如果你想用C#6的方式来实现:
public static class UIntExtensions
{
public static bool IsBitSet(this uint i, int bitNumber) => (i & (1 << bitNumber)) != 0;
}
这很容易在代码中使用:
if(Forced.IsBitSet((int)Math.Log(512,2)))
doStuff();
Forced & (1 << bitNumber)
听起来是一个好方法(在Ron Beyer的回答中展示了对访问进行包装的不错的函数)。for
循环或LINQ可以用来将每个位转换为布尔值。即使只有一个整数(可能需要根据您需要的位调整顺序,此处将最低位放在第一位)。var array = Enumerable.Range(0, 32)
.Select(bitNumber => (Forced & (1 << bitNumber)) !=0)
.ToArray();
(int)Math.Log(512,2)
看起来不像是在性能敏感的代码中使用的任何东西。可能有其他原因 - 也许使用数组可以使特定的代码更易读?(如果性能/大小很重要,可以将整数包装到具有索引器的结构体中) - Alexei Levenkovpublic static class UIntExtensions
{
public static byte[] GetBitArray(this uint v)
{
var r = byte[32];
for (var i = 0; i < 32; ++i)
{
r[i] = v & 1;
v = v >> 1
}
return r;
}
}
Forced & (1 << bitNumber)
... - Alexei Levenkov