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

标签 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)
}

例如给定以下 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/

相关文章:

c - 宏函数指针问题

twitter - twitter 雪花 IdWorker 中位移位的思考

c++ - 字符串 vector 到 uint8_t C++

c - C 中的位操作,设置最低有效位

java - 在 Java 中组合两个字节

C:在函数调用上传递参数时的类型转换

Objective-C 使用数学将数字显示为单词

c - goto语句提前结束程序的问题

python - Python中的二进制补码

python-3.x - python3 : How to get logical complement (negation) of a binary number, 例如。 '010' => '101' ?