#include
unsigned
char
func
(unsigned
char para)
return num;
}int
main
(void
)
方法一思想:定義num計算1的個數,因為形參是unsigned char型變數,所以設定8次迴圈,每一次拿形參的最高位和1相比(**中的實現為para & 0x80),如果為真值(運算結果不為0即為真值),則num++,不管運算結果為什麼,para都要左移一位(當前位比較過後讓下一位頂替當前位成為最高位,然後再與0x80比較),8次迴圈完成,8個bit也就比較完成了,然後返回num作為1的個數即可。
#include
unsigned
char
func
(unsigned
char para)
intmain
(void
)
方法二思想:方法二這個思想作為面試題,我也是想了兩個小時才想出來(能力有限,大神有更簡單的方法歡迎指點一二)。
該函式的特點是內部不使用其他變數,這種方法可以用於極限減少棧使用的情況(不過一般也不差這點)。其思想是8個if語句用於分別判斷引數
的1到8位,1的個數放在低位,如果判斷為真值,那麼必然1的值就+1,這時候只需要把當前位置零並加上1,那麼包含當前位以下的所有位就表示1的數量。比如:
輸入56 56的二進位制為0011 1000
因為低三位均為0,我們直接判斷第4、5、6個if語句。
先看第4個if語句:
if(para & 0x08) para = (para & 0xf7) + 1;
if條件是用於判斷第4個位是否為1,明顯條件成立,第4位為1。
para = 0011 1000 0xf7 = 1111 0111
para & 0xf7 + 1 = 0011 0000 + 1 = 0x0011 0001
再看第5個if語句:
if(para & 0x10) para = (para & 0xef) + 1;
if條件是用於判斷第5個位是否為1,明顯條件成立,第5位為1。
para = 0011 0001(語句4的運算結果) 0xef = 1110 1111
para & 0xef + 1 = 0010 0001 + 1 = 0x0010 0010
最後看第6個if語句:
if(para & 0x20) para = (para & 0xdf) + 1;
if條件是用於判斷第6個位是否為1,明顯條件成立,第6位為1。
para = 0x0010 0010(語句5的運算結果) 0xdf = 1101 1111
para & 0xef + 1 = 0000 0010 + 1 = 0x0000 0011
後面的7和8位均為0,就不用做比較了,結果為para = 0x0000 0011 = 3
最初的para為65(二進位制為0011 1000),1的位數確實為3,結果正確。
原理不麻煩,就是表述起來繁瑣而已,讀者多輸入資料自己驗證就好了。
其他的方法還有好幾種,都是很基礎但是很精闢的方法,讀者可以參考一下下面這篇文章,除了上面兩種以外的4種方法:
c語言 統計整數二進位制中表示1的個數
統計整數的二進位制中1的個數。
最近都在牛客網刷題,有空就來寫下部落格,不得不說牛客網是個好地方!碰到這樣一道題 輸入乙個整數,輸出該數二進位制表示中1的個數。j a語言挺好的,畢竟封裝了這麼多庫,很多現有的函式,刷題也是666。廢話不說,輸入整數,可將其先轉換為二進位制,然後再進行統計1的個數。下面貼出 import j a.u...
中 統計整數二進位制1的個數
輸入乙個整數,輸出該數32位二進位制表示中1的個數。其中負數用補碼表示。這道題沒什麼難度,主要是補碼的使用。一般我們是先轉正數原碼,然後取反再加1。這裡介紹乙個比較方便的演算法,即將正數原碼掃瞄,遇到第乙個1不操作,此後每乙個數都取反 包括符號位,注意是從右往左 當然,你也可以先把符號位設定好。pu...
整數二進位制中1的個數
輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。如果是0,返回0 如果是正整數,除二取餘法 如果是負數 3.1 如果是 2147483648 int表示最大絕對值的負數 其補碼是1000 0000 0000 0000 0000 0000 0000 0000,故返回 1 3.2 其他...