激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 二進制中1的個數

二進制中1的個數

2019-10-15 10:26java之家 Java教程

這篇文章介紹了二進制中1的個數,有需要的朋友可以參考一下

前言 
最近會手寫一些常考的面試題目,測試通過后會跟大家分享一下

移位法
僅適應于正數的做法:

移位法就是每次判斷n的二進制的最低位是否為1,時間復雜度為O(logn)

復制代碼代碼如下:


int nativeOnenum(int n)   
{   
    int count = 0;   

    while (n) {   
        if (n & 1)  count ++;   
        n >>= 1;   
    }   

    return count;   
}


對于正數沒問題,但是如果n為負數,這里就出現問題了,以負數-8為例,二進制補碼形式為11111111|11111111|11111111|11111000|,右移一位之后,變成了11111111|11111111|11111111|11111100|,因為是負數,所以符號位會一直補1,導致最后全1,出現死循環

針對這種情況,我們可以用變量flag =1,從右向左去和n比較,32位int最多比較32次即可知道n中1的數量

復制代碼代碼如下:


int oneNum(int n)   
{   
    int count, flag;   

    for (count = 0, flag = 1; flag; flag <<= 1) {   
        if (flag & n)   count ++;   
    }   

    return count;   
}


快速法
這種解法的思路是,二進制中1的個數只與1的位數有關,n & (n - 1)快速的去掉最左邊的1,例如7(0111) & 6(0110)= 6(0110),快速的去掉了最左邊的1

復制代碼代碼如下:


int quickOne(int n)   
{   
    int count = 0;   

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

    return count;   
}

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 午夜精品老牛av一区二区三区 | 91 免费看片| 精品成人免费一区二区在线播放 | 欧美黄色大片免费观看 | 午夜视频播放 | 久久艹艹艹| 国产精品久久久久久久av | 精品国产欧美一区二区 | 毛片视频网站 | 国产免费一区二区三区视频 | 91精品国产777在线观看 | 久久艹精品| 久久爽精品区穿丝袜 | 国产精品视频一区二区三区四 | 主播粉嫩国产在线精品 | 偿还电影免费看 | www.17c亚洲蜜桃| 亚洲热线99精品视频 | 久久久久亚洲a | 亚洲第一页夜 | 国产人成精品综合欧美成人 | 久久久精品视频免费看 | 欧美激情猛片xxxⅹ大3 | 青青草成人免费视频在线 | 欧美人与性禽动交精品 | 久久福利小视频 | 31freehdxxxx欧美| 国产噜噜噜 | 久久久久免费电影 | 久久国产精品二国产精品中国洋人 | 成人黄色小视频网站 | 亚洲视频在线观看免费 | 久久网站热最新地址 | 久久成人激情视频 | 九九热精彩视频 | 欧美成人国产va精品日本一级 | 久久久久久久久久久久久久久伊免 | 久久综合久久精品 | 免费一级高清毛片 | 91社区电影 | 一级大片久久 |