二进制数反转

 

 (1)
使用了归并排序的思路(最快)
但是时间复杂度比归并排序要小,每行代码都相当于完成了一次归并
#include <stdio.h>
unsigned RevBit(unsigned x)
{
    x=(x&0x55555555)<<1|(x>>1)&0x55555555;
    x=(x&0x33333333)<<2|(x>>2)&0x33333333;
    x=(x&0x0f0f0f0f)<<4|(x>>4)&0x0f0f0f0f;
    x=(x&0x00ff00ff)<<8|(x>>8)&0x00ff00ff;
    x=x<<16|x>>16;
    return x;
}
void main()
{
    unsigned x = RevBit(0xf0ec9999);
    printf("%x/n",x);
}


(2)
把一个32位整数按位反转,即第1位转到第32位,第2位转到第31位,依次下去。一牛人写的算法如下:
unsigned int bit_reverse(unsigned int n)
{
    n = ((n >> 1) & 0x55555555) | ((n << 1) & 0xaaaaaaaa);
    n = ((n >> 2) & 0x33333333) | ((n << 2) & 0xcccccccc);
    n = ((n >> 4) & 0x0f0f0f0f) | ((n << 4) & 0xf0f0f0f0);
    n = ((n >> 8) & 0x00ff00ff) | ((n << 8) & 0xff00ff00);
    n = ((n >> 16) & 0x0000ffff) | ((n << 16) & 0xffff0000);
    return n;
}
第一行代码为奇偶位相互交换;第二行为以两位为一单元,奇偶单元进行交换;第三行为以四位为一单元,奇偶单元进行交换;第四行为以八位为一单元,奇偶单元进行交换;最后一行为以十六位为一单元,奇偶单元进行交换。至此,32位反转完成,算法结束。

 

(3) Stanford University

参考(http://graphics.stanford.edu/~seander/bithacks.html )

在 C++ 中实现二进制数反转可以通过多种方式完成,以下是两种常见的实现方法: ### 方法一:基于十进制运算的二进制反转 此方法类似于十进制数的反转逻辑,通过依次提取低位并构建结果来实现二进制数反转。 ```cpp #include <iostream> using namespace std; class Solution { public: uint32_t reverseBits(uint32_t n) { int i = 32; uint32_t res = 0; while (i--) { res = res * 2 + n % 2; // 提取低位并构建反转结果 n = n / 2; } return res; } }; ``` 该方法通过循环 32 次(因为 `uint32_t` 是 32 位无符号整数)来处理每一位,将输入数的每一位提取出来并逐步构建反转后的结果[^1]。 --- ### 方法二:使用位运算进行二进制反转 此方法利用位运算操作,通过移位和按位与操作来提取每一位并构建反转结果。 ```cpp class Solution { public: uint32_t reverseBits(uint32_t n) { uint32_t rn = 0; for (int i = 0; i < 32; i++) { rn <<= 1; // 将结果左移一位,为下一位腾出空间 rn += (n & 0x01); // 提取当前最低位并加入结果中 n >>= 1; // 输入右移一位,处理下一位 } return rn; } }; ``` 此方法通过逐位提取输入数的最低位,并将其添加到结果的最低位,然后将结果左移一位,从而实现完整的 32 位反转[^4]。 --- ### 示例用法 以下是如何使用上述方法的简单示例: ```cpp int main() { Solution sol; uint32_t n = 0b0000001010010100000111010011100; // 示例输入 uint32_t reversed = sol.reverseBits(n); cout << "Reversed binary number: " << reversed << endl; return 0; } ``` 该程序将输出反转后的二进制数。 --- ### 总结 - 方法一更接近十进制反转的逻辑,适用于理解二进制反转的基本思想。 - 方法二利用位运算,效率更高,适用于实际开发中的性能优化。 两种方法都能有效实现二进制数反转,具体选择取决于应用场景和性能需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值