【问题标题】:BitArray - Shift bitsBitArray - 移位位
【发布时间】:2016-02-21 03:31:22
【问题描述】:

我有一个 System.Collections.BitArray 数组(约 3000 个项目),我想将所有位向左移动 1。但是该集合似乎不支持该操作(即 bitArray

谢谢!

【问题讨论】:

    标签: c# .net bitarray


    【解决方案1】:

    自己重新创建位数组作为ulong[] 的包装器;以这种方式实现小于 64 的数字移位是小菜一碟,与其他建议的方法相比,这将花费更少的时间并杀死更少的北极熊。通过警惕“最终会落下的位”,如果您想保留它们,您可能必须增加数组(或者不增加,如果它们为零并且您说不存在的元素隐含地保持为零)。

    【讨论】:

      【解决方案2】:

      我不确定效率如何,但这种扩展方法可以完成这项工作

      public static BitArray ShiftRight(this BitArray instance)
      {
          return new BitArray(new bool[] { false }.Concat(instance.Cast<bool>().Take(instance.Length - 1)).ToArray());
      }
      

      【讨论】:

      • OP 要求左移。我喜欢这个,所以这里是一个左移版本: return new BitArray( (instance.Cast().Take(instance.Length - 1).ToArray()).Concat(new bool[] { newState }) .ToArray() );
      • 确实如此。谢谢:)
      【解决方案3】:

      System.Numerics.BigInteger 确实支持位移。

      【讨论】:

      • 有一个警告:“与整数基元的按位左移操作不同,LeftShift 方法保留原始 BigInteger 值的符号。”所以 (-3
      • 而且原因是 BigInteger 类型是有符号的。
      【解决方案4】:

      我想到的最简单的方法是将 BitArray 转换为支持按位移位和返回的 BigInt 或类似结构。现在,我认为 .Net 4 中内置的 BigInteger 不支持移位,但还有其他支持,例如 Mono 的实现。

      【讨论】:

        【解决方案5】:

        这个简单的 sn-p 显示了一种手动方法。 bitArray[0] 的值被覆盖:

        //... bitArray is the BitArray instance
        
        for (int i = 1; i < bitArray.Count; i++)
        {
           bitArray[i - 1] = bitArray[i];
        }
        
        bitArray[bitArray.Count - 1] = false // or true, whatever you want to shift in
        

        将此作为扩展方法应该没什么大不了的。

        【讨论】:

        • 太棒了……但速度很慢。我认为会有一个特殊的运算符或方法,因为我们正在玩比特。
        • 您可以将内容从BitArray 复制到bool[],然后使用偏移量将数据复制到另一个bool[]。最后,您可以从生成的bool[] 重新创建您的BitArray。但我怀疑它会比访问每个元素的约 3000 位更快。
        猜你喜欢
        • 2011-11-16
        • 2016-11-27
        • 2014-06-08
        • 2013-05-04
        • 2017-05-31
        • 2016-10-31
        • 2012-02-22
        相关资源
        最近更新 更多