在C中掩蔽后封装位

在C中掩蔽后封装位,c,bit-manipulation,bitwise-operators,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 有没有一种有效的方法来实现这一点?我知道我可以

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

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
相同

首先,执行一个&mask,将1放置在a的未使用位置上

假设您有
a=a10a20a30a40
。您想获得编号
a1a2a3a4
。可能性不多

您可以拥有一个由短整数组成的预计算向量V,并为每个条目关联相应的值

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


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

我不知道您想做什么。0xFF&0xAA是0xAA。它不是0xF0。从删除二进制符号开始,这是令人困惑的。@Lundin他试图从黑客的喜悦中实现
Compress
函数。然而,在他的问题中,他表达了更高的期望值,这是可能的。您试图将结果放入
uint8\t
变量中,但您的初始值是
uint16\t
类型,编译器将进行一些转换,您将丢失数据。可能重复@Noxet Hacker的操作这是一个非常好的主意。代码必须非常快,查找表可能是我在这里的最佳选择。