假设我有一个数字,我想将每个其他位解释为一个新数字,例如
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
。可能性不大。
您可以使用短整数的预先计算的向量V,并为每个条目关联相应的值。
例如,如果面具是v[0b10100010]
,13
将是0b10101010
。
如果预先计算的向量不是太大,它将保留在高速缓存L1中,因此它将非常快,例如,如果您将数字分成8或16位组。