LeetCode190 顛倒二進位制位
阿新 • • 發佈:2019-01-08
題目
顛倒給定的 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; } }