我正在对可变长度的位串进行一些位操作。
我定义了一个函数 setBits(char *res, int x, int y)
应该对 *res
变量传递的那个位串起作用,给定一个 x
和 y
(只是提一下,我正在尝试使用每个 x 8 位来实现类似 Bloom 过滤器的东西):
void setBits(char *res, int x, int y)
{
*res |= x << (y * 8)
}
例如给定以下 x-y vector {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*
它不起作用还是我完全遗漏了一些非常愚蠢的东西?
最佳答案
假设是 8 位字符,您可以在 *res
中存储的最大值是0xff
即 (1<<8)-1
.
考虑当您调用 setBits
时会发生什么对于 x=1
, y=1
x << (y * 8) == 1 << (1 * 8)
== 1 << 8
== 0x100
*res
是一个 8 位值,因此只能存储此计算的低 8 位。对于 y
的任何非零值,可以存储在 *res
中的位保证为 0。
关于C:对可变长度位串的位操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16064644/