1. 程式人生 > >LeetCode190 顛倒二進位制位

LeetCode190 顛倒二進位制位

題目

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

示例

輸入: 43261596
輸出: 964176192
解釋: 43261596 的二進位制表示形式為 00000010100101000001111010011100 ,返回 964176192,其二進位制表示形式為 00111001011110000010100101000000 。

C++程式碼

方法1:
先將輸入n轉換為二進位制,並逐位儲存在vector中,由於始終在vector末尾新增元素,最後得到的vector已經是顛倒後的,但是考慮到是32位二進位制位,所以不足32位的要繼續在末尾添0.

class Solution {
public:
    uint32_t reverseBits(uint32_t n) 
    {
        vector<int> tmp;
        uint32_t num = 0;
        uint32_t i = n; //注意這裡的i的資料型別
        while (i)
     	{
      		int r = i % 2;
      		tmp.push_back(i % 2);
      		i /= 2;
     	}
     	int len = tmp.size();
     	for (; len < 32; len++)
      		tmp.push_back(0);
     	len = tmp.size();
     	for (vector<int> ::iterator iter = tmp.begin(); iter != tmp.end(); iter++)
     	{ 
      		num = num + *iter*pow(2, --len);
     	}
     	return num;
    }
};

方法2:
採用位邏輯運算。
&:一個數&1,則是取其二進位制的末位;
<<:a<<b,a的二進位制左移b位;
將num初始化為0,然後將num左移一位,可以將n的二進位制的最後一位取出,賦給num最後一位,然後將n右移一位,如此迴圈32次(因為為32位)

class Solution {
public:
    uint32_t reverseBits(uint32_t n) 
    {
        uint32_t num;
        for(int i=0;i<32;i++)
        {
            num<<=1;
            num+=(n&1);
            n>>=1;
        }
     return num;
    }
}