N的二進制中1的個數

解法一:

對於二進制數的操作,我們知道除以一個2,原來的位數將會減少一位,如果除的過程中有餘數,那麼就表示當前位置有一個1,否則爲0。

以10100010爲例:
第一次除以2時,商爲1010001,餘0。
第二次除以2時,商爲101000,餘1。

第三次除以2時,商爲10100,餘0。

第四次除以2時,商爲1010,餘0。
第五次除以2時,商爲101,餘0。
第六次除以2時,商爲10,餘1。
第七次除以2時,商爲1,餘0。
第八次除以2時,商爲0,餘1。

解法二:

採用位操作。
以10100001爲例:
右移一位,結果爲1010000,移出位爲1
再右移一位,結果爲101000,移出位爲0
再右移一位,結果爲10100,移出位爲0
………
比上面更好的解決了問題,還有更簡單的做法嗎?

解法三:

位操作雖然比除,求餘操作的效率高了很多。但是,時間複雜度沒有改變,時間複雜度還是O(log2v),log2v爲二進制的位數。現在我們想設計出一種算法解決這個問題時,只與二進制表達式中的1的個數有關的(先介紹按位與)
以10100001爲例:
  10100001    10100000   10000000
&10100000 &10011111 &01111111
  10100000    10000000   00000000

解法四:

也許你感到上面的算法已經足夠快了,但是這是最好的解法嗎?難道不能設計出O(1)的解法,即當你輸入一個數時,對應的結果也知道了。




擴展問題:給你兩個整數A和B,問把A變成B需要改變多少位。

解放三代碼:

#include<iostream>
using namespace std;
int main()
{
int N,n=0;
while(cin>>N)
{
while(N)
{
N=N&(N-1);
n++;
}
cout<<n<<endl;
}
}

發佈了33 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章