顛倒給定的 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; }