【簡單算法】46.顛倒二進制位


顛倒給定的 32 位無符號整數的二進制位。

示例:

輸入: 43261596
輸出: 964176192
解釋: 43261596 的二進制表示形式為 00000010100101000001111010011100 ,
     返回 964176192,其二進制表示形式為 00111001011110000010100101000000 。
進階:
如果多次調用這個函數,你將如何優化你的算法?

解題思路:

1.循環交換位,交換16次即可。第i位與第33-i位交換。

代碼如下:

class Solution {
public:
    int bit_test(uint32_t x,uint32_t n){
        return (x&(1<<n))>>n;  
    }
    
    bool bit_clear(uint32_t &x,uint32_t n){
        x = x&(~(1<<n));
        return true;
    }
    
    bool bit_set(uint32_t &x,uint32_t n){
        x = x|(1<<n);
        return true;
    }
    
    uint32_t reverseBits(uint32_t n) {
        
        for(int i = 0; i <= 15;++i){
            uint32_t bit1 = bit_test(n,i);
            uint32_t bit2 = bit_test(n,31-i);
            bit_clear(n,i);
            bit_clear(n,31-i);
            if(bit1){
                bit_set(n,31-i);
            }
            if(bit2){
                bit_set(n,i);
            }            
        }
        
        return n;
    }
};

2.將該數所有的位順序顛倒即可(移位方向相反),即將原來的100變為001.

uint32_t reverseBits(uint32_t n) {
        uint32_t m=0;
        for(int i=0;i<32;i++){
            m<<=1;//m向左移1位;
            m = m|(n & 1);//m的末位設置為n的末位
            n>>=1;//n向右移1位
        }
        return m;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM