【问题标题】:How do I implement a bit array?如何实现位数组?
【发布时间】:2011-08-25 07:26:52
【问题描述】:

当前方向:

以 unsigned char 开头,在我的系统上使用 sizeof 为 1 字节。范围是 0-255。 如果 length 是我需要的位数,那么 elements 就是我在数组中需要的元素(字节)数。

constant unsigned int elements = length/8 + (length % y > 0 ? 1 : 0);  
unsigned char bit_arr[elements];

现在我添加了基本功能,例如设置、取消设置和测试。其中 j 是每字节的位索引,i 是字节索引,h = 位索引。我们有 i = h / 8 和 j = i % 8。

伪代码:

bit_arr[i] |= (1 << j); // Set 
bit_arr[i] &= ~(1 << j);  // Unset
if( bit_arr[i] & (1 << j) ) // Test

【问题讨论】:

  • 避免“战俘”。请改用位移位 > 运算符。 (1
  • 我不知道你可以使用位移来做到这一点。谢谢。
  • 没有什么可以保证一个字节 == 8 位。它可能因平台/CPU而异。 IIRC CHAR_BITS 将告诉您 char 中有多少位(这与 C 中的字节相同,顺便说一句——它被定义为最小的可单独寻址的内存单元)。
  • if( bit_arr[i] &amp;= pow(2,j) ) 测试错误,使用&amp; 而不是&amp;=

标签: c arrays bit


【解决方案1】:

看起来您非常清楚需要做什么。虽然不是pow(2, j),而是使用1 &lt;&lt; j。您还需要更改您的test 代码。您不希望测试对数组进行赋值。

【讨论】:

    【解决方案2】:

    pow() 会给你浮点值,这是你不想要的。完全没有。它可能对您有用,因为您使用 2 的幂,但随着 j 变大,它可能会变得很奇怪。

    您最好改用1 &lt;&lt; j。消除任何浮动怪异的可能性,它可能也表现更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 2012-04-16
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多