c - 在 C 中屏蔽后打包位

标签 c bit-manipulation bitwise-operators

假设我有一个数字,我想将每隔一位解释为一个新数字,例如

uint16_t a = 0b1111111000000001;
uint16_t mask = 0xAAAA; // 0b1010101010101010

我现在希望能够将所有其他位打包到两个 8 位变量中,例如

uint8_t b = a & mask ... //  = 0b11110000
uint8_t c = a & ~mask ... // = 0b11100001

有没有一种有效的方法来实现这一点?我知道我可以循环和移动,但我要对很多数字执行此操作。如果我能同时获得 b 和 c 就更好了。

最佳答案

如果你想避免太多的移位,你可以预先计算一些表。

我为 a&mask 做这件事。对于其他情况,它与 a&~mask 相同。

首先,您执行一个 & 掩码以将 1 放在 a 的未使用位置上。

假设您有 a=a1 0 a2 0 a3 0 a4 0。您想要获取号码 a1 a2 a3 a4。可能性不多。

您可以有一个预先计算的短整数 vector V,并为每个条目关联相应的值。

例如,如果掩码为 0b10101010,则 v[0b10100010] 将为 13

如果预先计算的 vector 不是太大,它将保留在缓存 L1 中,因此它会非常快,例如,如果您将数字分成 8 位或 16 位的组。

关于c - 在 C 中屏蔽后打包位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55224524/

相关文章:

c - 删除数组中相同数字的重复项

python - 在 python 中旋转位

c - ansi c 1999 TC3 中的逗号运算符示例

java - 这种构建数字的位移是如何工作的?

php - 有什么办法可以反转这个按位函数吗?

java - 将两个整数保存为一个

c++ - 整数回绕的正确方法?

按位运算中的字符转换

c - 如何在 makefile 中包含 *.so 文件

c - 当静态变量被声明两次时会发生什么?