【问题标题】:Comparing set of bits in byte array比较字节数组中的位集
【发布时间】:2010-06-16 14:00:06
【问题描述】:

我有一个字节数组,如下:

byte[] array = new byte[] { 0xAB, 0x7B, 0xF0, 0xEA, 0x04, 0x2E, 0xF3, 0xA9};

任务是找出其中出现“0xA”的数量。 你能建议怎么做吗?答案是 6。

【问题讨论】:

    标签: c#-3.0 arrays bits


    【解决方案1】:

    因此,根据您的评论,您需要数组中字节中位模式 1010 的出现总数。

    对于给定的字节b,计数是总和

    (b & 0x0A) == 0x0A ? 1 : 0
    (b & 0x14) == 0x14 ? 1 : 0
    (b & 0x28) == 0x28 ? 1 : 0
    (b & 0x50) == 0x50 ? 1 : 0
    (b & 0xA0) == 0xA0 ? 1 : 0
    

    (留作练习:这是在做什么?)

    把这个放在一个函数中,为数组中的每个字节调用它,对结果求和。

    【讨论】:

      【解决方案2】:

      如果将整个数组视为单个位串:

      0xAB,    0x7B,    0xF0,    0xEA,    0x04,    0x2E,    0xF3,    0xA9 is then:
      10101011 01111011 11110000 11101010 00000100 00101110 11110011 10101001
      ====                         ====                              ====
        ====                         ====                              ====
      

      这有 1010 发生了 6 次。

      如果您不尝试跨字节边界进行匹配,您可以尝试以下方法(在 Perl 中测试并手动翻译):

      int counter = 0;
      for (int i = 0; i < array.length; ++i)
      {
          for (int bits = 0xA0, mask = 0xF0; bits >= 0x0A; bits >>= 1, mask >>= 1)
          {
              if ((array[i] & mask) == bits)
                  ++counter;
          }
      }
      

      要跨字节边界匹配,您必须从下一个字节移入位。尝试这样的事情(在 Perl 中测试并手动翻译):

      int counter = 0;
      byte tester = array[0];
      
      for (int i = 1; i < array.length + 1; ++i)
      {
          byte nextByte = i < array.length ? array[i] : 0;
      
          for (int bit = 0; bit < 8; ++bit)
          {
              if ((tester & 0xF0) == 0xA0)
                  ++counter;
      
              tester <<= 1;
              if ((nextByte & 0x80) != 0)
                  tester |= 1;
      
              nextByte <<= 1;
          }
      }
      

      两个程序都计数为 6,因为在此示例中没有跨字节边界的 1010 个序列。

      【讨论】:

      • 不,他们有。重点是:数组中的第一个元素是10101011。这意味着它至少有2个1010(8-4位)和1010(6-2位)。我应该检查每一个事件。问题是我不能超出字节边界。
      • 我应该找到 1010(这是 0xA)。
      • 所以我应该检查前 4 位 (8-5) 然后我应该右移 (?) 并比较另外 4 位。我应该做到这一点,直到阵列结束。我尝试使用 BitArray: BitArray arr = new BitArray(array);但无法比较。
      • 非常感谢,但是这个例子不起作用。它发现了 17 次而不是 6 次。
      • if (nextByte & 0x80 != 0) - 这部分应该是 ((nextByte & 0x80) != 0) for != - 对于 &
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 2010-11-26
      • 1970-01-01
      • 2023-03-05
      • 2010-09-07
      • 1970-01-01
      相关资源
      最近更新 更多