0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

三種方法計(jì)算二進(jìn)制中1的個(gè)數(shù),最后一種比較炸裂!

學(xué)益得智能硬件 ? 來源:學(xué)益得智能硬件 ? 2023-11-24 17:35 ? 次閱讀
如何計(jì)算一個(gè)整數(shù)的二進(jìn)制表示中 1 的個(gè)數(shù)?看看三位同學(xué)給出的代碼。
#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;
}

第一種最簡(jiǎn)單,只要讓這個(gè)數(shù)字跟 0x01 進(jìn)行與運(yùn)算,就能判斷出來最低位是不是1。然后右移一位,進(jìn)行同樣的操作。循環(huán)32次,就能得到結(jié)果。這是剛?cè)腴TC語言的同學(xué)寫的代碼。
#include 


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


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


    printf("%d
", count);
    return 0;
}
第二種稍微厲害一些,用到了 x & (x - 1) 這么一行代碼,它的作用就是讓二進(jìn)制表示中最后一個(gè) 1 變成 0 ,不斷的讓這些 1 變成 0,最后這個(gè)數(shù)字也就變成了 0 ,只要知道這行代碼執(zhí)行了多少次,結(jié)果也就知道了。能寫出這個(gè)代碼,簡(jiǎn)歷上寫個(gè)掌握C語言編程一點(diǎn)也不為過。
#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;  
}
最后一種比較炸裂,本來很簡(jiǎn)單的一個(gè)問題,被它寫得非常復(fù)雜。這是當(dāng)年阿里的一道C語言筆試題。代碼的功能也是計(jì)算整數(shù) temp 的二進(jìn)制表示中 1 的個(gè)數(shù)。原題中 temp 的值是0x11530828,換成二進(jìn)制是:
0001 0001100100110000100000101000
假設(shè)有個(gè)二進(jìn)制數(shù):01,含有 1 個(gè) 1,正好二進(jìn)制 01 對(duì)應(yīng)的十進(jìn)制也是 1。再假設(shè)有個(gè)二進(jìn)制數(shù) 11,含有 2 個(gè) 1,正好二進(jìn)制 11 對(duì)應(yīng)的十進(jìn)制是 2。于是不難得出一個(gè)結(jié)論:如果一個(gè)二進(jìn)制數(shù)只有兩位,那么它對(duì)應(yīng)的十進(jìn)制數(shù)就是該二進(jìn)制中包含的 1 的個(gè)數(shù)。算法中核心的代碼有 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
經(jīng)過第一行代碼,相鄰的兩個(gè)數(shù)字相加,得到:
0 1 0 1 1 1 0 2 0 0 1 0 0 1 1 0
對(duì)應(yīng)的 temp 是:
0001000101010010 0000 0100 0001 010
經(jīng)過第二行代碼,相鄰的兩個(gè)數(shù)字相加,得到:
1 1 2 2 0 1 1 1
對(duì)應(yīng)的 temp 是:
0001 0001 0010 0010 0000 0001 0001 0001
經(jīng)過第三行代碼,相鄰的兩個(gè)數(shù)字相加,得到:
2 4 1 2
對(duì)應(yīng)的 temp 是:
0000001000000100 0000 0001 0000 0010
經(jīng)過第四行代碼,相鄰的兩個(gè)數(shù)字相加,得到:
6 3
對(duì)應(yīng)的 temp 是:
0000 0000 0000 0110 0000 0000 0000 0011
經(jīng)過第五行代碼,相鄰的兩個(gè)數(shù)字相加,得到:
9
對(duì)應(yīng)的 temp 是:
00000000000000000000000000001001
結(jié)果就是整數(shù) temp 二進(jìn)制表示中 1 的個(gè)數(shù)。



聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 二進(jìn)制
    +關(guān)注

    關(guān)注

    2

    文章

    795

    瀏覽量

    41654
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4788

    瀏覽量

    68625

原文標(biāo)題:三種方法計(jì)算二進(jìn)制中1的個(gè)數(shù),最后一種比較炸裂!

文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    進(jìn)制二進(jìn)制之間的轉(zhuǎn)換原理

    1.3.4 將(155)D轉(zhuǎn)換為二進(jìn)制數(shù)解:當(dāng)要將個(gè)很大的十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù)時(shí),采用例題1.3.3的做法很費(fèi)時(shí) ,我們可以采用另外一種方法
    發(fā)表于 04-06 23:54

    二進(jìn)制格雷碼與自然二進(jìn)制碼的互換

    位、13位、14位或更高位等多種。其中采用循環(huán)二進(jìn)制編碼的絕對(duì)式編碼器,其輸出信號(hào)是一種數(shù)字排序,不是權(quán)重碼,每位沒有確定的大小,不能直接進(jìn)行比較大小和算術(shù)運(yùn)算,也不能直接轉(zhuǎn)換成其他
    發(fā)表于 03-08 14:16

    Labview如何將個(gè)數(shù)字轉(zhuǎn)換為5位二進(jìn)制,8位二進(jìn)制以及任意位的二進(jìn)制表示呢

    Labview如何將個(gè)數(shù)字轉(zhuǎn)換為5位二進(jìn)制,8位二進(jìn)制以及任意位的二進(jìn)制表示呢
    發(fā)表于 01-22 17:22

    二進(jìn)制

    二進(jìn)制   二進(jìn)制與十進(jìn)制的區(qū)別在于數(shù)碼的個(gè)數(shù)和進(jìn)位規(guī)律有很大的區(qū)別,顧名思義,二進(jìn)制的計(jì)數(shù)規(guī)律為逢
    發(fā)表于 04-06 23:48 ?8200次閱讀
    <b class='flag-5'>二進(jìn)制</b>

    二進(jìn)制編碼和二進(jìn)制數(shù)據(jù)

    二進(jìn)制編碼和二進(jìn)制數(shù)據(jù)   二進(jìn)制編碼是計(jì)算機(jī)內(nèi)使用最多的碼制,它只使用兩個(gè)基本符號(hào)"0"和"1",并且通過由這兩個(gè)符號(hào)組成的
    發(fā)表于 10-13 16:22 ?4790次閱讀

    二進(jìn)制電平,什么是二進(jìn)制電平

    二進(jìn)制電平,什么是二進(jìn)制電平 在二進(jìn)制數(shù)字通信系統(tǒng),每個(gè)碼元或每個(gè)符號(hào)只能是“1”和“0”兩個(gè)狀態(tài)之
    發(fā)表于 03-17 16:51 ?2359次閱讀

    一種二進(jìn)制校正的10位100MS_sSARADC

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

    二進(jìn)制數(shù)據(jù)壓縮算法

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

    二進(jìn)制數(shù)轉(zhuǎn)換成bcd碼

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

    二進(jìn)制數(shù)據(jù)及取值范圍的計(jì)算方法

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

    二進(jìn)制最佳接收原理 二進(jìn)制最佳接收機(jī)的實(shí)現(xiàn)形式有哪兩?

    二進(jìn)制最佳接收原理 二進(jìn)制最佳接收機(jī)的實(shí)現(xiàn)形式有哪兩? 二進(jìn)制最佳接收原理是計(jì)算機(jī)通信中的重要概念,它是指在
    的頭像 發(fā)表于 11-27 16:19 ?1042次閱讀

    如何實(shí)現(xiàn)二進(jìn)制和BCD碼數(shù)據(jù)的相互轉(zhuǎn)變?

    的編碼標(biāo)準(zhǔn)。在本文中,我們將詳細(xì)討論二進(jìn)制和BCD碼數(shù)據(jù)的相互轉(zhuǎn)換方法。 、二進(jìn)制數(shù)的基本概念與表示方法
    的頭像 發(fā)表于 02-18 14:51 ?3608次閱讀

    二進(jìn)制補(bǔ)碼及與原碼的互相轉(zhuǎn)換方法

    大沙把些基礎(chǔ)的知識(shí)說清楚,本文介紹二進(jìn)制補(bǔ)碼及與原碼的轉(zhuǎn)換方法。 先說原碼,原碼?是一種計(jì)算機(jī)中對(duì)數(shù)字的
    的頭像 發(fā)表于 09-19 22:25 ?507次閱讀

    二進(jìn)制編碼器工作原理 如何選擇二進(jìn)制編碼器

    二進(jìn)制編碼器是一種數(shù)字電路,它將輸入的二進(jìn)制代碼轉(zhuǎn)換為對(duì)應(yīng)的輸出信號(hào)。在數(shù)字系統(tǒng),編碼器用于將數(shù)據(jù)從一種形式轉(zhuǎn)換為另
    的頭像 發(fā)表于 11-06 09:44 ?784次閱讀

    二進(jìn)制編碼器應(yīng)用場(chǎng)景 二進(jìn)制編碼器與模擬編碼器比較

    編碼器是將信息從一種形式或格式轉(zhuǎn)換為另一種形式的設(shè)備。在數(shù)字和模擬系統(tǒng),編碼器扮演著至關(guān)重要的角色。二進(jìn)制編碼器和模擬編碼器是兩常見的編
    的頭像 發(fā)表于 11-06 09:45 ?451次閱讀