c - 32 位字的镜像位

标签 c assembly bit-manipulation

在 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
-> <- -> <-  -> <- -> <-
----> <----  ----> <----
---------->  <----------

好吧,如果我们正在做 ASCII 艺术,这是我的:

7 6 5 4 3 2 1 0
 X   X   X   X 
6 7 4 5 2 3 0 1
 \ X /   \ X /
  X X     X X
 / X \   / X \
4 5 6 7 0 1 2 3
 \ \ \ X / / /
  \ \ X X / /
   \ X X X /
    X X X X
   / X X X \
  / / X X \ \
 / / / X \ \ \
0 1 2 3 4 5 6 7

它有点像 FFT 蝴蝶。这就是它与 FFT 一起出现的原因。

关于c - 32 位字的镜像位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4245936/

相关文章:

c - 连续数组元素之间的绝对差

c - 如何在 C 语言中运行程序同时监听用户输入?

c - Qt 中对 NetWkstaUserGetInfo 的 undefined reference ,但在 VS 中有效

c++ - “lock cmpxchg”如何在汇编中工作?

c - 左移运算符

algorithm - 用很少的给定信息导出特定的比特流

c - 在 OS X 上通过 ucontext 访问 EIP 和 EBP

assembly - 了解LDR和STR?

C++类反汇编

java - 如何使用 XOR 在 Java 中开发​OTPInputStream​