码迷,mamicode.com
首页 > 其他好文 > 详细

OJ练习37——T190 Reverse Bits

时间:2015-04-30 10:13:02      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

把一个32位无符号整数按位翻转,

For example, given input 43261596 (represented in binary as 00000010100101000001111010011100), return 964176192 (represented in binary as 00111001011110000010100101000000).

【思路】

可以首尾位交换,使用位运算和移位运算。

但是有个棘手的地方,想要把低位变成不能使用&(高位移位),因为如果高位是1,低位是0,结果就是0,不等于高位;

如果使用|(高位移位),又会有高位是0,低位是1,结果还是不等于高位。所以不能单单使用位运算。

【my code】

uint32_t reverseBits(uint32_t n) {
        uint32_t temp1,temp2,low,high,dis;
        high=0x80000000;
        low=0x1;
        dis=31;
        while(low<high){
            temp1=high & n;
            temp2=low & n;
            if(temp1!=temp2){
            if(temp2&&!temp1){
                n+=high;
                n-=low;
            }
            else if(!temp2&&temp1){
                n+=low;
                n-=high;
            }
            }
            high>>=1;
            low<<=1;
            dis--;
        }
        return n;
    }

【反思】

对于位运算一直都很不熟练,对于位的交换纠结了很久。看起来不是个聪明的做法。

耗时9ms,排名在c的效率范围。

【other code】

uint32_t reverseBits(uint32_t n) {
    uint32_t answer;
    uint32_t i;
    
    answer = 0;
    
    /*把一个unsigned int 数字1一直左移,直到它变成全0的时候,也就得到了该机器内unsigned int的长度*/
    for (i = 1; i != 0; i <<= 1)
    {
        answer <<= 1;
        if (n & 1) { answer |= 1; }
        n >>= 1;
    }
    
    return answer;
    }

【评价】

该法“新开了空间”,不过也只是一个无符号整数大小,微不足道,人家代码是很简洁的。

妙处在于for循环中,i!=0的条件,i左移,直到溢出为0.这就遍历了要求的位数(这里倒是不必要,已知32)。

耗时10ms,排名和我的算法一样。

所以说,总是有更优秀的算法。

OJ练习37——T190 Reverse Bits

标签:

原文地址:http://www.cnblogs.com/ketchups-notes/p/4468090.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!