LeetCode:190. 顛倒二進位制位(C++)
阿新 • • 發佈:2019-01-10
題目:
顛倒給定的 32 位無符號整數的二進位制位。
示例:
輸入: 43261596
輸出: 964176192
解釋: 43261596 的二進位制表示形式為 00000010100101000001111010011100 ,
返回 964176192,其二進位制表示形式為 00111001011110000010100101000000 。
進階:
如果多次呼叫這個函式,你將如何優化你的演算法?
解答:
可以這麼做:
新建一個變數,
把原數的第1位賦值給新數的第32位;
把原數的第2位賦值給新數的第31位;
……
把原數的第32位賦值給新數的第1位;
實現:
我們可以通過n & 1得到n的最後一位, 然後將n向右移一位,再來一次n & 1,於是得到原來n的第二位……
如果對新的變數進行左移,那麼可以把原來新變數的最後一位移至第二位, 第三位……一直到最高位。
class Solution { public: uint32_t reverseBits(uint32_t n) { uint32_t result = 0; for (int i = 0; i < 32; i++) { result <<= 1; result = result | (n & 1); /*這裡把n的最後一位加到result的最後一位, 注意到上一個result前面的位是不能動的,於是用一個按位或更新result*/ n >>= 1; } return result; } };