如題:
平常開發過程中,遇到求數的每位數字的時候,通常做法是將這個逐位右移,本題目計算整數的二進制中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),感興趣的同學可以加羣討論、交流、資料查找等,前進的道路上,你不是一個人奧^_^。