将一个bool列表转换为单个单元

本文关键字:转换 列表 单个 单元 bool 一个 | 更新日期: 2023-09-27 17:52:34

我有一个类,它正在解析要发送到另一个硬件设备的对象。该类包含一堆启用或禁用的特性(bool)。但是,我们只向硬件(本质上是一个单位,或16位整数)的数据写入字。

因此,我需要翻译
Feature1 (bool, true)
Feature2 (bool, false)
Feature3 (bool, false)
Feature4 (bool, false)
...
Feature16 (bool, false)

并将其解析为一个单词:

000000000001

设备将单词视为little-endian,仅供参考。

我试图按位或反对一个单位,但事实上,标志是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;
        }

将一个bool列表转换为单个单元

如果你在数组中有布尔值,你可以使用索引来设置相应的位(如果设置):

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);
}
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;

我没有完全理解功能部分,但这样的东西可以帮助你不知何故?

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;
    }
}

这是你的"圆滑"建议:

在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();
      }
   }
相关文章: