《劍指offer》c++版本 15.二進制中1的個數

如題:

平常開發過程中,遇到求數的每位數字的時候,通常做法是將這個逐位右移,本題目計算整數的二進制中1的個數,通過右移的方式,能夠解決部分問題,但是,這裏有個坑,如果整數爲負的話,右移後最左邊還是1,如果是循環的話,容易引起死循環。舉個例子:負數0x80000000,右移後不是0x40000000,而是0xC0000000,這是因爲,移位後,仍要保證是負數,一直右移,最終得到0XFFFFFFFF,死循環。

爲了解決上述問題,我們可以換個方式,上述方式是移位後和1比較,我們不移動數字,而是移動1,這裏1左移,對於32位整型,將1左移31次即可,完美避開死循環問題。

下面是本題c++解法:

//使用bit位和數字逐個比較累加
class Solution {
public:
     int  NumberOf1(int n) {
         int cnt = 0, bit = 1;
         
         for (int i = 0; i < 32; i++)
         {
             //將bit左移
             if (n & (bit << i))
                 cnt++;
         }
         return cnt;
     }
};

=============================================================================================

Linux應用程序、內核、驅動、後臺開發交流討論羣(745510310),感興趣的同學可以加羣討論、交流、資料查找等,前進的道路上,你不是一個人奧^_^。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章