來源:我是碼農,轉載請保留出處和鏈接!
本文鏈接:http://www.54manong.com/?id=1231
題目描述
輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼錶示。
時間限制:1秒 空間限制:32768K
直接上代碼吧:
int NumberOf1(int n) { int i; int num=0; for(i=0;i<32;i++) { if((n&(1<<i))!=0) num++; } return num; }
代碼很簡單,就是按位檢查是否爲1,如果是,就計數。
絕對最佳答案及分析:
int NumberOf1(int n) { int count = 0; while(n!= 0){ count++; n = n & (n - 1); } return count; }
答案正確:恭喜!您提交的程序通過了所有的測試用例
分析一下代碼:這段小小的代碼,很是巧妙。
如果一個整數不爲0,那麼這個整數至少有一位是1。如果我們把這個整數減1,那麼原來處在整數最右邊的1就會變爲0,原來在1後面的所有的0都會變成1(如果最右邊的1後面還有0的話)。其餘所有位將不會受到影響。
舉個例子:一個二進制數1100,從右邊數起第三位是處於最右邊的一個1。減去1後,第三位變成0,它後面的兩位0變成了1,而前面的1保持不變,因此得到的結果是1011.我們發現減1的結果是把最右邊的一個1開始的所有位都取反了。這個時候如果我們再把原來的整數和減去1之後的結果做與運算,從原來整數最右邊一個1那一位開始所有位都會變成0。如1100&1011=1000.也就是說,把一個整數減去1,再和原整數做與運算,會把該整數最右邊一個1變成0.那麼一個整數的二進制有多少個1,就可以進行多少次這樣的操作。
python代碼實現如下:
# -*- coding:utf-8 -*- class Solution: def NumberOf1(self, n): # write code here count = 0 if n < 0: n = n & 0xffffffff while n: count += 1 n = (n - 1) & n return count
另類解法:
首先判斷n是不是負數,當n爲負數的時候,直接用後面的
while
循環會導致死循環,因爲負數
向左移位的話最高位補
1
! 因此需要一點點特殊操作,可以將最高位的符號位
1
變成
0
,也就
是n &
0x7FFFFFFF
,這樣就把負數轉化成正數了,唯一差別就是最高位由
1
變成
0
,因爲少了
一個
1
,所以count加
1
。之後再按照
while
循環裏處理正數的方法來操作就可以啦!
最基本最簡單的解法:
//超級簡單容易理解 //&(與)
// //把這個數逐次 右移 然後和1 與,
//就得到最低位的情況,其他位都爲0,
//如果最低位是0和1與 之後依舊 是0,如果是1,與之後還是1。
//對於32位的整數 這樣移動32次 就記錄了這個數二進制中1的個數了
class Solution { public: int NumberOf1(int n) { int count=0; for(int i=0;i<32;i++){ if(n>>i&1) count++; } return count; } };