我有一个正在解析要发送到另一个硬件设备的对象的类。该类包含许多启用或禁用(bools)的功能。但是,我们只将数据写入硬件(基本上是一个uint或16位整数)。
因此,我需要翻译
Feature1 (bool, true)
Feature2 (bool, false)
Feature3 (bool, false)
Feature4 (bool, false)
...
Feature16 (bool, false)
并将其解析为一个单词:
000000000001
该设备将单词视为little-endian,fyi。
我试图按照或反对一个uint,但是这些标志是bool的事实使得这个混乱,所以我想知道是否有其他人有任何光滑的建议;)
编辑:我发布这篇文章之后,我放松了,想到了这个解决方案......
private static ushort BooleanToUint(List<bool> bools)
{
ushort word = 0;
for(int i = 0; i < bools.Count; i++)
{
if(bools[i])
{
int twoToPower = (1 << i);
word = (ushort) (word + twoToPower);
}
}
return word;
}
答案 0 :(得分:1)
如果您在数组中有布尔值,则可以使用索引来设置相应的位(如果已设置):
bool[] boolValues = Enumerable.Repeat(true, 16).ToArray(); //test
uint intValue = 0;
for (int i = 0; i < boolValues.Length; i++)
{
if (boolValues[i])
intValue += (uint)(1 << i);
}
答案 1 :(得分:0)
bool[] items;
items[1] = true;
items[2] = true;
items[3] = true;
....
items[15] = true;
string s = null;
for(var i = 15; i <= 15; i--)
{
s += Int.Parse(items[i].ToString());
}
return s;
答案 2 :(得分:0)
我完全不了解功能部分,但是这样的东西可以帮助你吗?
public static bool getFeature(int featureid) {
return true; // or whatever
}
static void Main(string[] args)
{
int bitmask = 0;
for (int i = 0; i < 16; i++) {
bitmask += getFeature(i) ? 1 << i : 0;
}
}
答案 3 :(得分:0)
这是你的“光滑”建议:
在“UInt16 []”类型上创建一个扩展方法,它将值数组返回到“单个单词”,如下所示:
public static class UintArrayExtender
{
public static string ToWord(this UInt16[] array)
{
string val = string.Empty;
if (array.Length > 0)
{
//works the array backwards
for (int i = array.Length; i >= 0; i--)
{
val += array[i].ToString();
}
}
return val;
}
}
现在,无论你需要使用它,你都可以将一个UInt16数组返回到一个单词,如下所示:
public string getTheWord()
{
UInt16[] myArray = new UInt16[15];
myArray[0] = 0;
myArray[1] = 0;
myArray[2] = 0;
myArray[3] = 0;
myArray[4] = 0;
myArray[5] = 0;
myArray[6] = 0;
myArray[7] = 0;
myArray[8] = 0;
myArray[9] = 0;
myArray[10] = 0;
myArray[11] = 0;
myArray[12] = 0;
myArray[13] = 0;
myArray[14] = 0;
myArray[15] = 1;
return myArray.ToWord();
}
}