1. 程式人生 > >求二進位制數中的1的個數

求二進位制數中的1的個數

第一種最常見的解法:

原理是:採用C語言十進位制轉換成二進位制的方法去解題

程式程式碼如下:

#include "Count.h"


int Count(char b)
{

int number = 0;

while (b)

{

if (1 == (b%2))  number++;


b /= 2;

}

return number;

}

然而從以前書中看到過,用移位的方式比除的方式速度更快,適合嵌入式系統

如何替代取餘的方法呢?採用按位與

程式程式碼如下:

int Count2(char b)
{
int number = 0;
while(b)
{
number += b & 0x01;
b >>= 1;
}
return number;
}


解法三:看了程式設計之美的解法,恍然大悟,絕了。除了考慮單純的硬體速率外,軟體效率更重要,即時間複雜度。

目前的時間複雜度仍然為O(log v),因為每次都是除以2,如何保證只與1的個數有關係呢。

採用的操作是通過本數與本數減1相比較

int Count3(char b)
{

int number = 0;

while (b)

{

b &= (b-1); //舉例7 和 6與剩下5

number++;

}

return number;

}


剩下的解法是比較極端的方式,如果位元組數只有8個可以直接建表列出,然後直接調取就可以。