假设我有一个数字,我想将每隔一位解释为一个新数字,例如
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/