zoukankan      html  css  js  c++  java
  • OJ练习37——T190 Reverse Bits

    把一个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,排名和我的算法一样。

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

  • 相关阅读:
    jQuery使用手册之Ajax支持(8)
    jQuery使用手册之动态效果(6)
    jquery插件 操作select
    提高jQuery的性能
    jQuery起点教程之使用AJAX(4)
    jQuery起点教程之插件制作(7)
    IE开发工具栏
    信息安全之DNS欺骗详解
    颜色取色器
    使DIV不被select等控件遮挡的解决办法
  • 原文地址:https://www.cnblogs.com/ketchups-notes/p/4468090.html
Copyright © 2011-2022 走看看