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