求二進位制數中1的個數

2021-04-16 07:15:01 字數 2460 閱讀 3832

對於乙個位元組(8bit)的變數,求其二進位制表示中「1」的個數,要求演算法的執行效率盡可能地高。

【解法一】

可以舉乙個八位的二進位制例子來進行分析。對於二進位制操作,我們知道,除以乙個2,原來的數字將會減少乙個0。如果除的過程中有餘,那麼就表示當前位置有乙個1。

int count(int v)

int num = 0;

while(v)

if(v % 2 == 1)

num++;

v = v/ 2;

return num;

【解法二】使用位操作

前面的**看起來比較複雜。我們知道,向右移位操作同樣也可以達到相除的目的。唯一不同之處在於,移位之後如何來判斷是否有1存在。對於這個問題,再來看看乙個八位的數字:10 100 001。

在向右移位的過程中,我們會把最後一位直接丟棄。因此,需要判斷最後一位是否為1,而「與」操作可以達到目的。可以把這個八位的數字與00000001進行「與」操作。如果結果為1,則表示當前八位數的最後一位為1,否則為0。**如下:

int count(int v)

int num = 0;

while(v)

num += v &0x01;

v >>= 1;

return num;

【解法三】

位操作比除、餘操作的效率高了很多。但是,即使採用位操作,時間複雜度仍為o(log2

v),log2

v為二進位制數的位數。那麼,還能不能再降低一些複雜度呢?如果有辦法讓演算法的複雜度只與「1」的個數有關,複雜度不就能進一步降低了嗎?

同樣用10 100 001來舉例。如果只考慮和1的個數相關,那麼,我們是否能夠在每次判斷中,僅與1來進行判斷呢?

為了簡化這個問題,我們考慮只有乙個1的情況。例如:01 000 000。

如何判斷給定的二進位制數裡面有且僅有乙個1呢?可以通過判斷這個數是否是2的整數次冪來實現。另外,如果只和這乙個「1」進行判斷,如何設計操作呢?我們知道的是,如果進行這個操作,結果為0或為1,就可以得到結論。

int count(int v)

int num = 0;

while(v)

v &= (v-1);

num++;

return num;

【解法五】查表法

int counttable[256] =

0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3,

3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3,

4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4,

3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3,

4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6,

6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4,

5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,

3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3,

4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4,

4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6,

7, 6, 7, 7, 8

int count(int v)

//check parameter

return counttable[v];

擴充套件問題

1.   如果變數是32位的dword,你會使用上述的哪乙個演算法,或者改進哪乙個演算法?

2.   另乙個相關的問題,給定兩個正整數(二進位制形式表示)a和b,問把a變為b需要改變多少位(bit)?也就是說,整數a 和b 的二進位制表示中有多少位是不同的?

by super.jiju

2.解決思想如下:計算a&b中1的個數t,用max(log(a),log(b))向下取整+1-t即可。

求二進位制數中1的個數

解法一 可以舉乙個八位的二進位制例子來進行分析。對於二進位制操作,我們知道,除以乙個2,原來的數字將會減少乙個0。如果除的過程中有餘,那麼就表示當前位置有乙個1。以10 100 010為例 第一次除以2時,商為1 010 001,余為0。第二次除以2時,商為101 000,余為1。因此,可以考慮利用...

求二進位制數中1的個數

對於乙個位元組 8bit 的無符號整型變數,求其二進位制表示中 1 的個數。c codes as below using system class program static void main string args program program new program for int i 0...

求二進位制數中1的個數

解法一 除2看餘數 int count byte v v v 2 return num 解法二 使用位操作 int count byte v return num 解法三 不斷清除n的二進位制表示中最右邊的1 為什麼n n 1 能清除最右邊的1呢?因為從二進位制的角度講,n相當於在n 1的最低位加上...