我正在对可变长度的位串执行一些操作。
我定义了一个函数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)
}
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*
它不起作用还是我完全错过了一些非常愚蠢的东西?
答案 0 :(得分:4)
假设8位字符,您可以在*res
中存储的最大值为0xff
,即(1<<8)-1
。
考虑为setBits
,x=1
{/ 1>致电y=1
时会发生什么
x << (y * 8) == 1 << (1 * 8)
== 1 << 8
== 0x100
*res
是一个8位值,因此只能存储此计算的最后8位。对于y
的任何非零值,可以保存在*res
中的位保证为0.