LeetCode 190. Reverse Bits

1.问题描述

Reverse bits of a given 32 bits unsigned integer.

Example:

Input: 43261596
Output: 964176192
Explanation: 43261596 represented in binary as 00000010100101000001111010011100, 
             return 964176192 represented in binary as 00111001011110000010100101000000.

Follow up:
If this function is called many times, how would you optimize it?

2.算法分析

2.1 移位运算

给定的是无符号型,所以不用考虑负数的情况,可以把原二进制数与1进行按位与操作,然后依次右移一位,逐次取出每一位,然后初始化一个32位的返回值res为0,与从原二进制数取出来的每一位进行按位或运算,或者相加,再把res左移一位,以便跟下一位进行或运算。

2.2 利用“归并排序”的思想分段

假设有一个输入为:0123 4567 89AB CDEF,

希望反转之后得到:FEDC BA98 7654 3210

1)相邻两个各自交换后:1032 5476 98BA DCFE

2)相邻4个两两交换后:    3210 7654 BA98 FEDC

3)相邻8个四四交换后:  7654 3210 FEDC BA98

4)相邻16个八八交换后:FEDC BA98 7654 3210

同理,对于32位的二进制,可以经过1,2,4,8,16位的交换以后实现。

3.代码实现

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_t res = 0;
        for(int i = 0; i<32; i++){
            
            //与1进行按位与,相当于取出最后一位
            uint32_t tmp = n & 1; 
            //右移一位,等着下一循环取出右边起第二位
            n >>= 1;
            //结果每次左移一位,然后与取出来的一位进行按位或操作
            res <<= 1 ;
            res |= tmp;
        }
       return res; 
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值