寫乙個函式返回引數二進位制中 1 的個數,如:15 的二進位製碼 0000 1111 中有 4 個 1。
解題思路:
第一步:得到這個引數的二進位制序列
第二步:用合適的方法對該二進位制序列中的 1 進行計數
第三步:得到最終結果
細緻講解:
1、如何得到乙個數的 二進位制 序列呢?
首先我們打個比方:比如我們要得到乙個 十進位制 數的每一位時,我們可以採取 " 對這個數 模10 除10 ,直到這個數變為 0 「,的方法得到我們想要的效果。
那麼,對於得到乙個引數的 二進位制 序列我們可以採取類似的方法,即:對這個引數 模2 除2,直到這個引數變為 0 。這樣我們就可以得到乙個引數的二進位制序列了。
2、怎樣對這個引數的二進位制序列中的 1 進行計數呢?
在得到這個引數的 二進位制 序列時,我們採取了」 對這個引數進行 模2 除2 ,直到這個引數變為 0"操作,在這個引數變為 0 之前,每進行一次這樣的操做,計數器就加" 1 ",這樣就可以得到這個引數的 二進位制 中 " 1 " 的個數。
**實現:
#define _crt_secure_no_warnings
#include#includeint count_one_bit(int m)
// 去掉得到的這個 1
m /= 2;
} // 返回計數器 count 的值
return count;
}int main()
當輸入引數 15 時,**執行結果:
當輸入引數為 -1 時,**執行結果:
我們知道 -1 的二進位製碼中 1 的個數為 32 個,但這裡**執行的結果為 0。
此時,我們就知道結果出錯了,所以我們判斷上述方法只對於 正數 有效,如果引數是 負數 結果就會出錯,所以下面我們對上述方法進行改進,使它對 負數 也成立。
方法改進:
使用 操作符 來實現得到乙個引數的 二進位制 序列中 1 的個數。
具體操作:對這個引數的二進位製碼 左移( >> ) i 位,並按位與( & ) 1,如果 按位與" 1 " 結果為 1 ,就給計數器加 " 1 ",直到 i == 32。
**實現如下:
#define _crt_secure_no_warnings
#include#includeint count_one_bit(int m)
} return count;
}int main()
當輸入引數 15 時,**執行結果:
當輸入引數 -1 時,**執行結果:
對於上述方法,仍然有缺點,就是對於任意給定的引數,無論這個引數的二進位制序列中有幾個 1 ,我們的迴圈都必須迴圈 32 次,那麼為了得到更簡單的辦法,我們就有了 」終極版「
終極版方法:設引數為 m , 則:m = m & (m - 1); 為核心思想。
方法講解:
**實現:
#define _crt_secure_no_warnings
#include#includeint count_one_bit(int m)
return count;
}int main()
當輸入引數 15 時,**執行結果:
當輸入引數 -1 時,**執行結果:
函式返回引數二進位制中1的個數
1.函式返回引數二進位制中1的個數 include int count one bits unsigned int value return num int main 2.獲取乙個數二進位制序列中所以偶數和奇數字,分別輸出二進位制序列 include int main printf n printf...
二進位制 二進位制中1的個數
題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。示例 1 輸入 00000000000000000000000000001011 輸出 3 解釋 輸入的二進位制串 0000000...
返回二進位制數中1的個數
解法一 思路 把整數減去1就是把最右邊的1變成0,如果它右邊還有0的話就把所有的0變成1,而它左邊的所有位都保持不變。接下來把該整數和它減去1的結果做按位與運算,相當於把它最右邊的1變成0。那麼乙個整數的二進位制表示中有多少個1,就可以進行多少次這樣的操作。eg value value 1 15轉換...