1

我正在对可变长度位字符串进行一些位操作。

我定义了一个函数,该函数应该对变量setBits(char *res, int x, int y)传递的位字符串起作用,给定 a和(顺便提一下,我正在尝试使用每 x 8 位来实现类似于 Bloom 过滤器的东西):*resxy

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

例如,给定以下 xy-vectors {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}

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

4

1 回答 1

4

假设 8 位字符,您可以存储的最大值*res0xffie (1<<8)-1

考虑一下当你调用时会发生setBits什么x=1y=1

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

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

于 2013-04-17T15:54:48.793 回答