請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1.因此如果輸入9,該函式輸出2.
注意:整數和負數以及0的區別,這是由儲存機制決定的。
分析:將輸入的整數依次右移並與1相位與!
源**如下:
#includeusing std::cout;
using std::endl;
using std::cin;
int numberofone1(long long n)
if (n > 0)
return result;
else
return result + 1;
}int main1()
system("pause");
return 0;
}
執行結果:
請輸入十進位制整數n:63
十進位制整數63中二進位制表示中1的個數為:6
請輸入十進位制整數n:-63
十進位制整數-63中二進位制表示中1的個數為:7
請輸入十進位制整數n:255
十進位制整數255中二進位制表示中1的個數為:8
請輸入十進位制整數n:-255
十進位制整數-255中二進位制表示中1的個數為:9
請輸入十進位制整數n:10
十進位制整數10中二進位制表示中1的個數為:2
請按任意鍵繼續. . .
上述方法直接移動整數,且可以處理輸入負整數的情況,接下來我們移動標誌位保持輸入的整數不變!
源**如下(十六進製制輸入方式):
#includeusing std::cout;
using std::cin;
using std::endl;
int numberofone2(int n)
return result;
}int main()
system("pause");
return 0;
}
執行結果:
請輸入十進位制數n:0x1
十進位制數1的二進位制表示中1的個數為:1
請輸入十進位制數n:0x8000
十進位制數32768的二進位制表示中1的個數為:1
請輸入十進位制數n:0x9
十進位制數9的二進位制表示中1的個數為:2
請輸入十進位制數n:0xff
十進位制數255的二進位制表示中1的個數為:8
請輸入十進位制數n:0x1ff
十進位制數511的二進位制表示中1的個數為:9
請按任意鍵繼續. . .
源**(十進位制):
#includeusing std::cout;
using std::cin;
using std::endl;
/* 負數在記憶體中是以補碼的形式儲存的,所以這種演算法對於直接輸入負整數時,計算是錯誤的!!!
負數的輸入應採取十六進製制的輸入形式
*/int numberofone2(int n)
return result;
}int main()
system("pause");
return 0;
}
執行結果:
請輸入十進位制數n:9
十進位制數9的二進位制表示中1的個數為:2
請輸入十進位制數n:-9
十進位制數-9的二進位制表示中1的個數為:31
請輸入十進位制數n:255
十進位制數255的二進位制表示中1的個數為:8
請輸入十進位制數n:-255
十進位制數-255的二進位制表示中1的個數為:25
請輸入十進位制數n:63
十進位制數63的二進位制表示中1的個數為:6
請按任意鍵繼續. . .
把乙個整數減去1,再和原來的整數做與運算,會把該整數最右邊乙個1變成0,那個乙個整數的二進位制表示中有多少個1,就可以進行多少次這樣的操作。
源**:
#includeusing std::cout;
using std::endl;
using std::cin;
/* 負數在記憶體中是以補碼的形式儲存的,所以這種演算法對於直接輸入負整數時,計算是錯誤的!!!
負數的輸入應採取十六進製制的輸入形式
*/int numberofone3(int n)
return result;
}int main()
system("pause");
return 0;
}
執行結果和方法二相似。
#include#includeint numberof1_solution1(int n)
return count;
}int numberof1_solution2(int n)
return count;
}void test(int number, unsigned int expected)
int main()
執行結果:
solution1: test for 00000000 passed.
solution2: test for 00000000 passed.
solution1: test for 00000001 passed.
solution2: test for 00000001 passed.
solution1: test for 0000000a passed.
solution2: test for 0000000a passed.
新加solution1: test for fffffff7 failed.
solution2: test for fffffff7 failed.
solution1: test for 7fffffff passed.
solution2: test for 7fffffff passed.
solution1: test for ffffffff passed.
solution2: test for ffffffff passed.
solution1: test for 80000000 passed.
solution2: test for 80000000 passed.
請按任意鍵繼續. . .
劍指offer面試題10 二進位制中1的個數
題目 請實現乙個函式,輸入乙個整數,輸出該二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1,因此如果輸入9,該函式輸出2。常規的解題思路 可以把n和1做與運算,如果結果為1,那麼n的最後一位為1,否則為0,然後n右移1位,再和1做與運算,直到判斷完n的所有位。int statis...
劍指offer 面試題10 二進位制中 1 的個數
題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如把 9 表示成二進位制是 1001 有 2 位是 1,因此如果輸入 9,函式輸出 2.這個題本來我的思路是模擬十進位制的規則,設定乙個計數變數count,初始值為0。然後用給的整數數和2進行取餘操作,結果只有兩種可能 0或1...
《劍指offer》(面試題10) 二進位制中1的個數
位運算 位運算是把數字用二進位制表示之後,對每一位上 0 或者 1 的運算。因為位運算總共只有五種運算 與,或,異或,左移和右移 與 0 0 0 1 0 0 0 1 0 1 1 1 或 0 0 0 1 0 1 0 1 1 1 1 1 異或 0 0 0 1 0 1 0 1 1 1 1 0 左移運算子 ...