假设我有一个数字,并且我想将其他位解释为一个新数字,例如
uint16_t a = 0b1111111000000001;
uint16_t mask = 0xAAAA; // 0b1010101010101010
我现在希望能够将其他所有位打包成两个8位变量,例如
uint8_t b = a & mask ... // = 0b11110000
uint8_t c = a & ~mask ... // = 0b11100001
是否有一种有效的方法来做到这一点?我知道我可以循环和移动,但是我要进行很多操作。如果可以同时获得b和c,那就更好了。
答案 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位的组。