返回引數二進位制中 1 的個數 函式實現

2021-08-31 07:17:54 字數 2204 閱讀 4367

寫乙個函式返回引數二進位制中 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轉換...