【问题标题】:Correct way to convert 8 bools into 1 byte将 8 个布尔值转换为 1 个字节的正确方法
【发布时间】:2013-09-14 08:55:54
【问题描述】:

简单问题:考虑到一个bool (true, false)和一个bit (1, 0)是一样的,那么在C#中将8个bool转换成一个字节的正确方法是什么?

例子:

真,真,真,真,真,真,真,真 == 11111111 == 255

真,假,假,假,假,假,假,假 == 10000000 == 128

假,假,假,假,假,假,假,假 == 00000000 == 0

以上是第一部分。我想创建一个扩展方法,像这样:

    public static byte[] ToByteArray(this bool[] bitArray)
    {
          // stuff here
          return byteArray;    
    }

结果必须是包含比 bool 数组少八倍的元素的 byteArray。

【问题讨论】:

  • 您正在询问如何将 8 个布尔值转换为一个字节,但您的示例方法返回一个字节数组。
  • 是的,就像我说的,byteArray 是第二部分,首先我需要将 8 个 bool 转换为 1 个字节

标签: c# optimization boolean byte


【解决方案1】:

稳健的解决方案(以防万一)。

以某种方式将它们分成 8 个一组(取决于顺序以及您希望如何调整它们 - 到 LSBRSB),然后通过在循环:

byte GetByte(bool[] bits)
{
    byte result = 0;
    for(int i = 0; i < bits.Length; i++)
        if(byte[i])
            result |= 1 << i;
    return result;
}

【讨论】:

  • @LS_dev,是的,谢谢。我提到过,bytes 的方法应该首先 prepared ^^,但是你可以添加绑定检查并抛出 ArgumentOutOfRangeException 或任何你想要的东西,这只是一个简单的例子将任何东西转换成比特。
【解决方案2】:

您可能正在搜索BitArray Constructor (Boolean[])

对于表示位,您在 C# 中具有特殊结构 BitArray。 所以你的代码看起来像这样:

var booleans = new bool[]{true, false, false, false};
var bitArray = new BitArray(booleans); 

【讨论】:

  • 是一个很好的解决方案,但是当指定一个长度并使用 SetAll(true) 时要小心这个错误,因为这将导致 -1(它是一个 int 的所有位),而不是给定的长度。
  • 那么,我怎样才能从中返回一个字节[]?
  • @Guilherme: CopyTo().
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 2012-03-02
  • 2014-10-11
  • 2020-06-02
相关资源
最近更新 更多