Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将布尔列表转换为单个uint_C#_Data Structures_Types - Fatal编程技术网

C# 将布尔列表转换为单个uint

C# 将布尔列表转换为单个uint,c#,data-structures,types,C#,Data Structures,Types,我有一个类正在解析要发送到另一个硬件设备的对象。该类包含一组启用或禁用的功能(bools)。但是,我们只将字写入到硬件的数据块(本质上是一个uint或16位整数) 因此,我需要翻译 Feature1 (bool, true) Feature2 (bool, false) Feature3 (bool, false) Feature4 (bool, false) ... Feature16 (bool, false) 并将其解析为一个单词: 000000000001 设备将一个单词视为litt

我有一个类正在解析要发送到另一个硬件设备的对象。该类包含一组启用或禁用的功能(bools)。但是,我们只将字写入到硬件的数据块(本质上是一个uint或16位整数)

因此,我需要翻译

Feature1 (bool, true)
Feature2 (bool, false)
Feature3 (bool, false)
Feature4 (bool, false)
...
Feature16 (bool, false)
并将其解析为一个单词:

000000000001
设备将一个单词视为little endian,仅供参考

我试图按位或反对uint,但事实上,这些标志是bools,这让事情变得一团糟,所以我想知道是否还有其他人有任何巧妙的建议;)

编辑:在我发布这篇文章之前,我很放松,想到了这个解决方案

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;
        }
私有静态ushort booleantoint(列表布尔)
{
ushort-word=0;
for(int i=0;iint twoToPower=(1如果您在数组中有布尔值,您可以仅使用索引来设置相应的位(如果已设置):

bool[]boolValues=Enumerable.Repeat(true,16).ToArray();//测试
uint intValue=0;
for(int i=0;ibool[]项;
第[1]项=正确;
第[2]项=正确;
第[3]项=正确;
....
第[15]项=正确;
字符串s=null;

对于(var i=15;i我并不完全理解特征部分,但是类似的东西可以帮助您吗

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;
    }
}
publicstaticboolgetfeature(int-featureid){
返回true;//或其他
}
静态void Main(字符串[]参数)
{
int位掩码=0;
对于(int i=0;i<16;i++){
bitmask+=getFeature(i)?1以下是您的“圆滑”建议:

在“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;

      }

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

      }
   }
现在,您可以在任何需要使用它的地方将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;

      }

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

      }
   }

简单的位操作就可以了。我一点也不懂C,但基本上你会做
your_uint_var |(特性1我喜欢这个解决方案。非常类似于我提出的方法,非常人性化。