求二進位制數中的1的個數
阿新 • • 發佈:2018-11-09
第一種最常見的解法:
原理是:採用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個可以直接建表列出,然後直接調取就可以。