【问题标题】:How to convert a short to a bool[]?如何将short转换为bool []?
【发布时间】:2018-04-24 00:34:09
【问题描述】:

如何在 C# 中将 short 转换为布尔数组 (bool[])?我正在寻找一种算法,多种选择各有利弊。

例如,如果我有一个short that = 132,即二进制的 10000100

所以我想要一个数组 {false, false, true, false, false, false, false, true }

bool[] ToArrayOfBool(short source)
{
    bool[] result = new bool[16];

    ///Do Some stuff here


    return result;
}

【问题讨论】:

标签: c#


【解决方案1】:

您可以使用BitArray class:

byte input = 132;
var bits = new BitArray(new byte[] { input });
foreach (var b in bits)
{
    Console.WriteLine(b);
}

这会产生一个IEnumerable<bool>,但您也可以将其转换为数组:

byte input = 132;
var bits = new BitArray(new byte[] { input }).Cast<bool>().ToArray();
foreach (var b in bits)
{
    Console.WriteLine(b);
}

输出:

False
False
True
False
False
False
False
True

您也可以将其保留为 short,然后使用类似这样的扩展方法获取所需的位:

public static bool GetBit(this short This, int bitNumber)
{
    return (This & (1 << bitNumber)) != 0;
}

for (int i=0; i<8; i++)
{
    Console.WriteLine(input.GetBit(i));
}

Example on DotNetFiddle

【讨论】:

    【解决方案2】:
    using System;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
                Console.WriteLine($"132 = {string.Join(",", ConvertToArray(132))}");
                Console.ReadKey();
            }
    
            static bool[] ConvertToArray(short @short)
            {
                var result = new bool[16];
                for (int i = 0; i < 16; i++)
                {
                    result[i] = (@short & (short)1) == (short)1 ? true : false;
                    @short = (short)(@short >> 1);
                }
                return result;
            }
    
        }
    }
    

    【讨论】:

      【解决方案3】:
      for (int i = 0; i < 16; i++) {
          // Single bit bitmask at index i: 0b0001, 0b0010, 0b0100 etc..
          int bitmask = 1 << i;
          // Check to see if the bit at that mask is set.
          result[i] = (source & bitmask) != 0;
      }
      

      【讨论】:

        【解决方案4】:

        线索

        var bits = new bool[16];
        if(i &x0001) bits[0] = true;
        if(i &x0002) bits[1] = true;
        

        【讨论】:

          【解决方案5】:

          看起来你有三个步骤:

          1. 首先使用Convert.ToString(myshort, 2) 转换为二进制,其中myshort 是您的值。

          2. 遍历字符串的每个字符并测试它是否等于 1,并将每个字符添加到 bool 数组中。

          3. 反转数组(或者可以在第1步之后反转字符串)

          因为我很无聊,这里有一个例子:)

              short myshort = 132;
              Console.WriteLine("Short: " + myshort);
          
              var binarystring = Convert.ToString(myshort, 2);
              Console.WriteLine("Binary: " + binarystring);
          
              var boolarray = new bool[binarystring.Length];
          
              for (var i = 0; i < binarystring.Length; i++) {
                  boolarray[i] = binarystring[i] == '1';          
              }
          
              Array.Reverse(boolarray);
          
              //output result     
              foreach (var b in boolarray) {
                  Console.Write(b.ToString() + ", ");
              }
          

          输出是:

          Short: 132
          Binary: 10000100
          False, False, True, False, False, False, False, True,
          

          【讨论】:

            【解决方案6】:

            感谢@pm100,这就是我的想法

            public bool[] ToArrayOfBool(short source)
            {
                bool[] result = new bool[16];
            
                for (int i = 0; i < 16; i++)
                {
                    result[i] = (source & (i * i)) == i * i; 
                }
            
                return result;
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-06-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多