你会怎么用C做的? (例如:如果我们必须镜像8位,则10110001变为10001101).某些处理器上是否有任何可以简化此任务的说明?
解决方法
它实际上称为“位反转”,通常在FFT加扰中完成. O(log N)方式是(最多32位):
uint32_t reverse(uint32_t x,int bits) { x = ((x & 0x55555555) << 1) | ((x & 0xAAAAAAAA) >> 1); // Swap _<>_ x = ((x & 0x33333333) << 2) | ((x & 0xCCCCCCCC) >> 2); // Swap __<>__ x = ((x & 0x0F0F0F0F) << 4) | ((x & 0xF0F0F0F0) >> 4); // Swap ____<>____ x = ((x & 0x00FF00FF) << 8) | ((x & 0xFF00FF00) >> 8); // Swap ... x = ((x & 0x0000FFFF) << 16) | ((x & 0xFFFF0000) >> 16); // Swap ... return x >> (32 - bits); }
也许这个小的“可视化”有助于:
前3个赋值的示例,带有uint8_t示例:
b7 b6 b5 b4 b3 b2 b1 b0 -> <- -> <- <- -> <- -> ----> <---- ----> <---- ----------> <----------