求乙個位元組(8bit)有幾位為 1 的O 1 解

2021-06-01 11:46:40 字數 1923 閱讀 6803

真是很極端的做法啊

宋寶華 [email protected] 軟體報

問題:對於乙個位元組(8bit)的資料,求其中「1」的個數,要求演算法的執行效率盡可能地高。

分析:作為一道著名外企的面試題,看似簡單,實則可以看出乙個程式設計師的基本功底的紮實程度。你或許已經

想到很多方法,譬如除、餘操作,位操作等,但都不是最快的。本文一步步分析,直到最後給出乙個最快的方

法,相信你看到本文最後的那個最快的方法時會有驚詫的感覺。

解答:首先,很自然的,你想到除法和求餘運算,並給出了如下的答案:

方法1:使用除、餘操作

#include

#define byte unsigned char

int main(int argc, char *argv)

a = a / 2;

}printf("\nthe num of 1 in the byte is %d", num);

return 0;

}很遺憾,眾所周知,除法操作的運算速率實在是很低的,這個答案只能意味著面試者被淘汰!

好,精明的面試者想到了以位操作代替除法和求餘操作,並給出如下答案:

方法2:使用位操作

#include

#define byte unsigned char

int main(int argc, char *argv)

/*或者這樣計算1 的個數:*/

/* for(i=0;i<8;i++)

*/printf("\nthe num of 1 in the byte is %d", num);

return 0;

}方法二中num += (a >> i) &0x01;操作的執行效率明顯高於方法一中的

if (a % 2 == 1)

a = a / 2;

到這個時候,面試者有被錄用的可能性了,但是,難道最快的就是這個方法了嗎?沒有更快的了嗎?方法二真

的高山仰止了嗎?

能不能不用做除法、位操作就直接得出答案的呢?於是你想到把0~255 的情況都羅列出來,並使用分支操作,

給出如下答案:

方法3:使用分支操作

#include

#define byte unsigned char

int main(int argc, char *argv)

printf("\nthe num of 1 in the byte is %d", num);

return 0;

}方法三看似很直接,實際執行效率可能還會小於方法二,因為分支語句的執**況要看具體位元組的值,如果a=0,

那自然在第1 個case 就得出了答案,但是如果a=255,則要在最後乙個case 才得出答案,即在進行了255

次比較操作之後!

看來方法三不可取!但是方法三提供了乙個思路,就是羅列並直接給出值,離最後的方法四只有一步之遙。眼

看著就要被這家著名外企錄用,此時此刻,絕不對放棄尋找更快的方法。

終於,靈感一現,得到方法四,乙個令你心潮澎湃的答案,快地令人咋舌,演算法中不需要進行任何的運算。你

有足夠的信心了,把下面的答案遞給面試官:

方法4:直接得到結果

#include

#define byte unsigned char

/* 定義查詢表 */

byte numtable[256] =

;int main(int argc, char *argv)

這是個典型的空間換時間演算法,把0~255 中1 的個數直接儲存在陣列中,位元組a 作為陣列的下標,checknum[a]

直接就是a 中「1」的個數!演算法的複雜度如下:

時間複雜度:o(1)

空間複雜度:o(2n)

恭喜你,你已經被這家著名的外企錄用!老總向你伸出手,說:「welcome to our company」

不知道嵌入式那點記憶體是否允許鼓勵這樣做。

求乙個位元組中,1 0的個數

真是很極端的做法啊 宋寶華 21cnbao 21cn.com 軟體報 問題 對於乙個位元組 8bit 的資料,求其中 1 的個數,要求演算法的執行效率盡可能地高。分析 作為一道著名外企的面試題,看似簡單,實則可以看出乙個程式設計師的基本功底的紮實程度。你或許已經 想到很多方法,譬如除 餘操作,位操作...

int為什麼佔4個位元組?乙個位元組為什麼是8位?

不知道大家有沒有思考過這樣的問題,乙個位元組為什麼是8位呀,也許還有小夥伴不知道我說的這些是什麼,沒關係往下看。第乙個解釋 歷史 是ibm為system 360設計了一套8位ebcdic編碼,涵蓋了數字 大小寫字母和大部分常用符號,同時又相容廣泛用於打孔卡的6位bcdic編碼。第二個解釋,二進位制我...

計算乙個位元組裡面有多少bit被置1 ,三種演算法

其中一二的方法,參考了網上的 關於 計算乙個位元組裡 byte 裡面有多少bit被置1 的思考 這篇文章 第一種,移資料 int fun1 int data return count 沒什麼可解釋的,但如果是個負數,可能會出問題 第二種,移1 int fun2 int data return cou...