在C中屏蔽后的打包位

问题描述 投票:1回答:1

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

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

我现在希望能够将每个其他位打包成两个8位变量,比如

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

有没有一种有效的方法来实现这一目标?我知道我可以循环和转换,但我会为很多数字做这个。如果我可以同时获得b和c两者,那就更好了。

c bit-manipulation bitwise-operators
1个回答
1
投票

如果您想避免过多的移动,可以预先计算一些表。

我是为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位组。

© www.soinside.com 2019 - 2024. All rights reserved.