C:对可变长度位串的位操作

时间:2013-04-17 15:51:01

标签: c bit-manipulation bit

我正在对可变长度的位串执行一些操作。

我定义了一个函数setBits(char *res, int x, int y),该函数应该对*res变量传递的位字符串起作用,给定xy(只是提到,我是尝试使用每x 8位的Bloom过滤器实现类似的东西:

void setBits(char *res, int x, int y)
{
  *res |= x << (y * 8)
}

E.g。给定以下x-y向量{0,0} ; {0,1} ; {1,2} ; {2,3},我希望有一个像这样的字符串(反之亦然,取决于是小端还是大端,但现在不重要):

0000 0010 0000 0001 0000 0000 0000 0000

因此,最低8位应来自{0,0},后8位来自{0,1},后8位来自{1,2},最后来自{2,3}。< / p>

不幸的是,我似乎没有理由这样做,setBits总是只返回最后的结果(在这种情况下,即来自{2,3}的位字符串)。我调试了代码并意识到*res始终为0 - 但为什么呢?我究竟做错了什么?是我选择char*它不起作用还是我完全错过了一些非常愚蠢的东西?

1 个答案:

答案 0 :(得分:4)

假设8位字符,您可以在*res中存储的最大值为0xff,即(1<<8)-1

考虑为setBitsx=1 {/ 1>致电y=1时会发生什么

x << (y * 8) == 1 << (1 * 8)
             == 1 << 8
             == 0x100

*res是一个8位值,因此只能存储此计算的最后8位。对于y的任何非零值,可以保存在*res中的位保证为0.