LeetCode 190 Reverse Bits

本文介绍了一种高效的方法来反转32位整数的位顺序,使用位操作技巧,逐步从高低位交换到单个比特位的交换,实现了简洁高效的反转算法。

首先最直观的暴力做法:

 1 uint32_t reverseBits(uint32_t n) {
 2         string str(32,'0');
 3         int index = 31;
 4         do{
 5             str[index--] = n%2+'0';
 6             n/=2;
 7         }while(n);
 8         uint32_t result = 0;
 9         for(int i=31; i>=0;--i){
10             result = result*2 + (str[i]-'0');
11         }
12         return result;      
13 }

 

然后思考怎么通过位操作来实现reverse,直观理解就是最低bit位变成了最高bit位,但是如何通过为操作进行调整呢?

1.高16位和低16位进行交换

2.高16位的高8位与低8位进行交换,低16位的高8位与低8位进行交换

。。。

最后,每两位进行交换就可以实现

例如8位bit数, abcdefgh

高四位与第四位交换 => efghabcd

2=> ghefcdab

1=> hgfedcba

1 uint32_t reverseBits(uint32_t n){
2         n = (n>>16) | (n<<16);
3         n = ((n&0xff00ff00)>>8) | ((n&0x00ff00ff)<<8);
4         n = ((n&0xf0f0f0f0)>>4) | ((n&0x0f0f0f0f)<<4);
5         n = ((n&0xcccccccc)>>2) | ((n&0x33333333)<<2);
6         n = ((n&0xaaaaaaaa)>>1) | ((n&0x55555555)<<1);
7         return n;
8     }

 

转载于:https://www.cnblogs.com/ackerzju/p/Reverse-Bits.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值