二進制中1的個數(shù)
更新時間:2013年09月27日 16:24:05 作者:
這篇文章介紹了二進制中1的個數(shù),有需要的朋友可以參考一下
前言
最近會手寫一些??嫉拿嬖囶}目,測試通過后會跟大家分享一下
移位法
僅適應(yīng)于正數(shù)的做法:
移位法就是每次判斷n的二進制的最低位是否為1,時間復雜度為O(logn)
int nativeOnenum(int n)
{
int count = 0;
while (n) {
if (n & 1) count ++;
n >>= 1;
}
return count;
}
對于正數(shù)沒問題,但是如果n為負數(shù),這里就出現(xiàn)問題了,以負數(shù)-8為例,二進制補碼形式為11111111|11111111|11111111|11111000|,右移一位之后,變成了11111111|11111111|11111111|11111100|,因為是負數(shù),所以符號位會一直補1,導致最后全1,出現(xiàn)死循環(huán)
針對這種情況,我們可以用變量flag =1,從右向左去和n比較,32位int最多比較32次即可知道n中1的數(shù)量
int oneNum(int n)
{
int count, flag;
for (count = 0, flag = 1; flag; flag <<= 1) {
if (flag & n) count ++;
}
return count;
}
快速法
這種解法的思路是,二進制中1的個數(shù)只與1的位數(shù)有關(guān),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;
}
最近會手寫一些??嫉拿嬖囶}目,測試通過后會跟大家分享一下
移位法
僅適應(yīng)于正數(shù)的做法:
移位法就是每次判斷n的二進制的最低位是否為1,時間復雜度為O(logn)
復制代碼 代碼如下:
int nativeOnenum(int n)
{
int count = 0;
while (n) {
if (n & 1) count ++;
n >>= 1;
}
return count;
}
對于正數(shù)沒問題,但是如果n為負數(shù),這里就出現(xiàn)問題了,以負數(shù)-8為例,二進制補碼形式為11111111|11111111|11111111|11111000|,右移一位之后,變成了11111111|11111111|11111111|11111100|,因為是負數(shù),所以符號位會一直補1,導致最后全1,出現(xiàn)死循環(huán)
針對這種情況,我們可以用變量flag =1,從右向左去和n比較,32位int最多比較32次即可知道n中1的數(shù)量
復制代碼 代碼如下:
int oneNum(int n)
{
int count, flag;
for (count = 0, flag = 1; flag; flag <<= 1) {
if (flag & n) count ++;
}
return count;
}
快速法
這種解法的思路是,二進制中1的個數(shù)只與1的位數(shù)有關(guān),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;
}
相關(guān)文章
Java中java.lang.ClassCastException異常原因以及解決方法詳解
這篇文章主要給大家介紹了關(guān)于Java中java.lang.ClassCastException異常原因以及解決方法的相關(guān)資料,ClassCastException從字面上看是類型轉(zhuǎn)換錯誤,通常是進行強制類型轉(zhuǎn)換時候出的錯誤,需要的朋友可以參考下2024-02-02IDEA?2020.3最新永久激活碼(免費激活到?2099?年,親測有效)
分享一下?IntelliJ?IDEA?2020.3.1?最新激活注冊碼,破解教程如下,可免費激活至?2099?年,親測有效,本文給大家分享兩種方法,感興趣的朋友參考下吧2021-01-01Spring依賴注入Dependency Injection的三種方式
依賴注入(Dependency Injection)和控制反轉(zhuǎn)(Inversion of Control)是同一個概念。具體含義是:當某個角色(可能是一個Java實例,調(diào)用者)需要另一個角色(另一個Java實例,被調(diào)用者)的協(xié)助時,在傳統(tǒng)的程序設(shè)計過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實例2023-02-02