如何使用按位运算实现位向量?

时间:2013-07-20 16:57:44

标签: c++ c bit-manipulation bitwise-operators

我正在研究编程珍珠一书中的一个问题,他们建议这个函数在位向量中设置一个位。我对它的作用感到有点困惑。

#define BITSPERWORD 32
#define MASK 0x1F
#define SHIFT 5
#define N 1000000

int a[1 + N/BITSPERWORD];

void set(int i){
   a[i >> SHIFT] |= (1 << (i & MASK)); 
}

这是我对此代码的解释(可能是错误的)。 如果我= 64,

1)首先,它需要i并通过SHIFT(5位)向右移动。这相当于DIVIDING(不是我想象的那样乘以i 2^5。因此,如果i64,则a的索引为2 (64 / 2^5)

2)a[2] |= (1 << (64 & MASK))
64 & 1 = 1000000 & 01 = 1000001
所以1左移多少位????

1 个答案:

答案 0 :(得分:3)

  1. 看起来这个方法是如何工作的,尽管我觉得有更好的方法可以设置一点。是找到它基本上除以32的ith位的索引,因为这是每个字的位数。
  2. 由于此处使用的运算符为|,因此该函数将该位设置为不切换位
  3. 0x1F实际上是31,当你用i获得余数时(不知道为什么他们没有使用%
  4. 最后,移位将1移到正确的位置,或者在向量中使用右侧插槽。
  5. 如果您打算使用此代码

    1. 如果没有定义并使用更明显的方法,你可以写得很清楚,我怀疑它会对速度产生影响。
    2. 您也应该使用std::bitset
    3. 使用面具让剩下的人特别烦恼我,因为我很确定它不一定适用于每一个数字,31恰好工作因为它全是1的