精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

三種方法計算二進制中1的個數,最后一種比較炸裂!

學益得智能硬件 ? 來源:學益得智能硬件 ? 2023-11-24 17:35 ? 次閱讀
如何計算一個整數的二進制表示中 1 的個數?看看三位同學給出的代碼。
#include 


int main()
{
    int x = 1000, count = 0;


    for (int i = 0; i < 32; i++)
    {   
        if (x & 0x01)
        {   
            count++;
        }   


        x = x >> 1;
    }   


    printf("%d
", count);


return 0;
}

第一種最簡單,只要讓這個數字跟 0x01 進行與運算,就能判斷出來最低位是不是1。然后右移一位,進行同樣的操作。循環32次,就能得到結果。這是剛入門C語言的同學寫的代碼。
#include 


int main()
{
    int x = 1000, count = 0;


    while (x) 
    {   
        x = x & (x - 1); 
        count++;
    }   


    printf("%d
", count);
    return 0;
}
第二種稍微厲害一些,用到了 x & (x - 1) 這么一行代碼,它的作用就是讓二進制表示中最后一個 1 變成 0 ,不斷的讓這些 1 變成 0,最后這個數字也就變成了 0 ,只要知道這行代碼執行了多少次,結果也就知道了。能寫出這個代碼,簡歷上寫個掌握C語言編程一點也不為過。
#include 


int main()
{ 
    unsigned int temp = 1000; 


    temp = (temp & 0x55555555) + ((temp & 0xaaaaaaaa)>>1);
    temp = (temp & 0x33333333) + ((temp & 0xcccccccc)>>2);
    temp = (temp & 0x0f0f0f0f) + ((temp & 0xf0f0f0f0)>>4);
    temp = (temp & 0xff00ff) + ((temp & 0xff00ff00)>>8);
    temp = (temp & 0xffff) + ((temp & 0xffff0000)>>16);


    printf("%d
", temp);


    return 0;  
}
最后一種比較炸裂,本來很簡單的一個問題,被它寫得非常復雜。這是當年阿里的一道C語言筆試題。代碼的功能也是計算整數 temp 的二進制表示中 1 的個數。原題中 temp 的值是0x11530828,換成二進制是:
0001 0001100100110000100000101000
假設有個二進制數:01,含有 1 個 1,正好二進制 01 對應的十進制也是 1。再假設有個二進制數 11,含有 2 個 1,正好二進制 11 對應的十進制是 2。于是不難得出一個結論:如果一個二進制數只有兩位,那么它對應的十進制數就是該二進制中包含的 1 的個數。算法中核心的代碼有 5 行,分別是:
temp = (temp & 0x55555555) + ((temp & 0xaaaaaaaa)>>1);
temp=(temp&0x33333333)+((temp&0xcccccccc)>>2);
temp=(temp&0x0f0f0f0f)+((temp&0xf0f0f0f0)>>4);
temp=(temp&0xff00ff)+((temp&0xff00ff00)>>8);
temp=(temp&0xffff)+((temp&0xffff0000)>>16);
每一行的作用都是讓相鄰的兩位相加,temp的原始值是:
0001 0001 1001 0011 0000 1000 0010 1000
經過第一行代碼,相鄰的兩個數字相加,得到:
0 1 0 1 1 1 0 2 0 0 1 0 0 1 1 0
對應的 temp 是:
0001000101010010 0000 0100 0001 010
經過第二行代碼,相鄰的兩個數字相加,得到:
1 1 2 2 0 1 1 1
對應的 temp 是:
0001 0001 0010 0010 0000 0001 0001 0001
經過第三行代碼,相鄰的兩個數字相加,得到:
2 4 1 2
對應的 temp 是:
0000001000000100 0000 0001 0000 0010
經過第四行代碼,相鄰的兩個數字相加,得到:
6 3
對應的 temp 是:
0000 0000 0000 0110 0000 0000 0000 0011
經過第五行代碼,相鄰的兩個數字相加,得到:
9
對應的 temp 是:
00000000000000000000000000001001
結果就是整數 temp 二進制表示中 1 的個數。



聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 二進制
    +關注

    關注

    2

    文章

    794

    瀏覽量

    41603
  • 代碼
    +關注

    關注

    30

    文章

    4753

    瀏覽量

    68368

原文標題:三種方法計算二進制中1的個數,最后一種比較炸裂!

文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    進制二進制之間的轉換原理

    1.3.4 將(155)D轉換為二進制數解:當要將個很大的十進制數轉換成二進制數時,采用例題1.3.3的做法很費時 ,我們可以采用另外一種方法
    發表于 04-06 23:54

    二進制格雷碼與自然二進制碼的互換

    位、13位、14位或更高位等多種。其中采用循環二進制編碼的絕對式編碼器,其輸出信號是一種數字排序,不是權重碼,每位沒有確定的大小,不能直接進行比較大小和算術運算,也不能直接轉換成其他
    發表于 03-08 14:16

    Labview如何將個數字轉換為5位二進制,8位二進制以及任意位的二進制表示呢

    Labview如何將個數字轉換為5位二進制,8位二進制以及任意位的二進制表示呢
    發表于 01-22 17:22

    二進制

    二進制   二進制與十進制的區別在于數碼的個數和進位規律有很大的區別,顧名思義,二進制的計數規律為逢
    發表于 04-06 23:48 ?8168次閱讀
    <b class='flag-5'>二進制</b>

    二進制編碼和二進制數據

    二進制編碼和二進制數據   二進制編碼是計算機內使用最多的碼制,它只使用兩個基本符號"0"和"1",并且通過由這兩個符號組成的
    發表于 10-13 16:22 ?4762次閱讀

    二進制電平,什么是二進制電平

    二進制電平,什么是二進制電平 在二進制數字通信系統,每個碼元或每個符號只能是“1”和“0”兩個狀態之
    發表于 03-17 16:51 ?2348次閱讀

    一種二進制校正的10位100MS_sSARADC

    一種二進制校正的10位100MS_sSARADC_倪亞波
    發表于 01-07 21:45 ?0次下載

    二進制數據壓縮算法

    二進制數據壓縮算法二進制計算技術中廣泛采用的一種數制。二進制數據是用0和1
    的頭像 發表于 02-28 09:31 ?2w次閱讀

    二進制數轉換成bcd碼

    二進制計算技術中廣泛采用的一種數制。二進制數據是用0和1個數碼來表示的數。它的基數為2,進位
    的頭像 發表于 11-22 07:01 ?1.2w次閱讀

    二進制數據及取值范圍的計算方法

    本文介紹二進制數據的相關知識,如定義、取值范圍計算、轉換為十進制方法以及些常見位數的二進制
    的頭像 發表于 11-08 15:48 ?2036次閱讀
    <b class='flag-5'>二進制</b>數據及取值范圍的<b class='flag-5'>計算方法</b>

    二進制最佳接收原理 二進制最佳接收機的實現形式有哪兩

    二進制最佳接收原理 二進制最佳接收機的實現形式有哪兩二進制最佳接收原理是計算機通信中的重要概念,它是指在
    的頭像 發表于 11-27 16:19 ?986次閱讀

    如何實現二進制和BCD碼數據的相互轉變?

    的編碼標準。在本文中,我們將詳細討論二進制和BCD碼數據的相互轉換方法二進制數的基本概念與表示方法
    的頭像 發表于 02-18 14:51 ?3319次閱讀

    二進制補碼及與原碼的互相轉換方法

    大沙把些基礎的知識說清楚,本文介紹二進制補碼及與原碼的轉換方法。 先說原碼,原碼?是一種計算機中對數字的
    的頭像 發表于 09-19 22:25 ?392次閱讀

    二進制編碼器工作原理 如何選擇二進制編碼器

    二進制編碼器是一種數字電路,它將輸入的二進制代碼轉換為對應的輸出信號。在數字系統,編碼器用于將數據從一種形式轉換為另
    的頭像 發表于 11-06 09:44 ?333次閱讀

    二進制編碼器應用場景 二進制編碼器與模擬編碼器比較

    編碼器是將信息從一種形式或格式轉換為另一種形式的設備。在數字和模擬系統,編碼器扮演著至關重要的角色。二進制編碼器和模擬編碼器是兩常見的編
    的頭像 發表于 11-06 09:45 ?278次閱讀