演算法學習記錄九(C++)--->二進位制中1的個數
描述
- 輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示。
分析
這種位運算的題目面試中很容易遇到
如果一個整數不為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,就可以進行多少次這樣的操作。
程式碼
class Solution {
public:
int NumberOf1(int n) {
int count = 0;
// 二進位制都為0的時候結束
while(n!=0){
count++;
// 當前數字減去1之後,最有變的1變成0,而1右邊的輸全部變成0
// 再和當前數字進行&運算 兩個位都為1時,結果才為1
// 因此每次進行一次&運算,就少掉一個1,最後統計count即可
n=n&(n-1);
}
return count;
}
};
相關文章
- 二進位制中1的個數
- 【刷演算法】二進位制中1的個數演算法
- 02_Python學習筆記之統計整數二進位制中1的個數Python筆記
- 位運算(一):二進位制中1的個數
- 位運算--求一個 數二進位制中1的個數
- 【劍指offer】二進位制中1的個數
- 求一個整數的二進位制中1的個數
- 題目1513:二進位制中1的個數
- 劍指 Offer 15. 二進位制中1的個數
- JZ-011-二進位制中 1 的個數
- 【c語言】統計一個數二進位制中的1的個數C語言
- 求二進位制數中1的個數(程式設計之美)程式設計
- 演算法學習之二進位制的妙用演算法
- C++輸入十進位制數,輸出對應二進位制數、十六進位制數C++
- ROP【二進位制學習】
- 【劍指offer中等部分4】二進位制中1的個數(java)Java
- offer通過--10二進位制中統計1的個數-2
- 查詢數N二進位制中1的個數(JS版 和 Java版)JSJava
- 三種語言實現計算二進位制中1的個數(C++/Python/Java)C++PythonJava
- 二進位制求5個1的格式。。。。
- C++學習記錄1C++
- Erlang學習筆記(七)二進位制型與位語法筆記
- 演算法學習記錄一(C++)--->二維陣列中的查詢演算法C++陣列
- poj3252 數位dp(所有比n小的二進位制位0的個數不少於1的個數)記憶化搜尋
- 求一個數的二進位制數中所含1的個數的程式碼實現
- 演算法學習記錄十(C++)--->數值的整數次方演算法C++
- 數字邏輯練習題-(二進位制/16進位制模擬)
- 某演算法競賽題——把一個二進位制的串轉換為十進位制整數演算法
- 演算法學習記錄二(C++)--->字串空格替換演算法C++字串
- 根據數字二進位制下 1 的數目排序排序
- Count 1 in Binary(二進位制中有多少個1)
- 演算法學習記錄十四(C++)--->二叉樹的映象演算法C++二叉樹
- Oracle中的二進位制、八進位制、十進位制、十六進位制相互轉換函式Oracle函式
- 知多一點二進位制中的負數
- 演算法學習之路|進位制轉換演算法
- day 1 c++小白學習記錄C++
- 負數的二進位制數問題
- 整數轉化成八進位制、十六進位制、二進位制,以及轉回