91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

一個數的二進制表示中1的個數——10

發布時間:2020-08-07 02:06:30 來源:網絡 閱讀:402 作者:給我個bit位 欄目:編程語言

    實現一個函數,輸入一個整數,輸出該數二進制表示中1的個數。例如,將9表示成二進制為1001,有2位是1,因此如果輸入數字9,該函數輸出2。


    如果讓我們將一個十進制的數轉換成二進制的表示,我們就會不停的模除模除2取它的余數,因此,就可以用這樣的方法解決:

#include <iostream>
using namespace std;

size_t count_one_num(int n)
{
    size_t count = 0;

    while(n != 0)
    {   
        if((n % 2) == 1)
            count++;
        n /= 2;
    }   
    return count;
}

int main()
{
    int n = 7;
    size_t ret = count_one_num(n);
    cout<<"one number in "<<n<<" are: "<<ret<<endl;

    return 0;
}


運行程序:

一個數的二進制表示中1的個數——10


    我們知道,任何一個數用機器語言來表示都是0和1的組合,而C/C++中提供了這樣的一個運算符,右移操作符“>>”和左移操作符“<<”,它們是將一個數的二進制位進行相應的向左移位和向右移位,而在上面的問題中,可以不斷地將整數向右進行移位,這樣取到其最低位的數字和1數字進行相與,就能夠得知最低位上的數字是1還是0了;

    但是提到移位操作符會存在一個問題,當將一個數進行左移時,左邊的位會被丟棄,而右邊的位會補0;當一個數進行右移操作時,右邊的位會被丟棄,那么左邊的補位會存在兩種情況:一種是邏輯移位,統一都補0;另一種是算數移位,會相應的補符號位;因此,在設計循環判斷條件的時候,不能將判斷數字是否為0作為循環條件了,而是應當將整數的位數也就是32位作為循環終止的條件,程序如下:

size_t count_one_num(int n)
{
    int i = 32; 
    size_t count = 0;
    while(--i)
    {   
        if((n & 1) == 1)
            ++count;
        n = n>>1;
    }   
    return count;
}


    除了上面的方法,其實還有一種利用數字的二進制來解決的辦法:可以想到,當一個數不為0的時候,它的二進制表示中至少有一個1,從而計數器就可以加1,然后就需要將二進制中的1一個一個地剔除掉直到數字變為0,那除了移位怎樣才能辦到呢?可以將數字 =(數字)&(數字-1),因為一個數字減1的時候,它最低位的一個1就會變成0,而最低位的1肯定都是0就會都變成1,也就相當于將數字12的二進制減1就為將1100減1變成了1011值為11,然后將11001011進行相&,那么就會變成1000,也就是成功的將12中的兩個1變成了一個1,以此類推就可以統計出二進制中1的個數了,代碼實現如下:

size_t count_one_num(int n)
{
    size_t count = 0;
    while(n != 0)
    {   
        ++count;
        n = n & (n-1);
    }   
    return count;
}


這樣的代碼是不是比前兩種更簡潔直觀呢,只是在理解上要稍微轉一下彎。



《完》

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临武县| 洛扎县| 宜昌市| 正镶白旗| 龙泉市| 即墨市| 曲阳县| 塔城市| 南康市| 吴桥县| 洪湖市| 波密县| 灵丘县| 新乡市| 永平县| 迁安市| 万年县| 镇雄县| 九寨沟县| 松桃| 江川县| 莎车县| 石柱| 个旧市| 中卫市| 晴隆县| 巴东县| 望奎县| 台北市| 咸阳市| 苍南县| 孟连| 安仁县| 抚宁县| 邵阳县| 和顺县| 清镇市| 元江| 多伦县| 岳阳县| 保山市|