在C中屏蔽后的打包位

时间:2019-03-18 15:14:11

标签: 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,那就更好了。

1 个答案:

答案 0 :(得分:1)

如果要避免过多的移位,可以预先计算一些表。

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

首先,您执行a&遮罩以将1的未使用位置删除。

假设您有a=a1 0 a2 0 a3 0 a4 0。您想获取数字a1 a2 a3 a4。可能性不大。

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

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

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