輸入一個(gè)整數(shù),輸出該數(shù)二進(jìn)制表示下1的個(gè)數(shù)
暴力方法
在不借助Java的API的情況下要完成這道題的一個(gè)思路是循環(huán)統(tǒng)計(jì)各位是否為1。可能有人會(huì)想先將這個(gè)整數(shù)轉(zhuǎn)換為字符串表示的二進(jìn)制再來(lái)統(tǒng)計(jì)1的個(gè)數(shù)杆烁。但是想想整數(shù)在計(jì)算機(jī)中本身就是存儲(chǔ)為二進(jìn)制數(shù)的,比如7简卧,二進(jìn)制為111
兔魂,借助大多數(shù)高級(jí)語(yǔ)言都有的右移操作運(yùn)算符便可完成這道題
public int NumberOf1(int n) {
int count = 0;
// 需要右移32次
int x = 32;
while (x-- != 0) {
count += n & 1;
n >>= 1;
}
return count;
}
討論區(qū)里更好的解法
public int NumberOf1(int n) {
int count = 0;
while (n != 0) {
n = n & (n - 1);
count += 1;
}
return count;
}
這個(gè)解法的思路妙在n = n & (n - 1)
這行代碼上,舉個(gè)栗子:假設(shè)n = 12举娩,二進(jìn)制表示為1100
析校,n-1 = 11,二進(jìn)制表示為1011
铜涉,兩者相與為1000
智玻,不難發(fā)現(xiàn),在n的二進(jìn)制表示中最右邊的1開(kāi)始都變?yōu)榱?芙代。再在外面套個(gè)循環(huán)吊奢,相當(dāng)于說(shuō)能進(jìn)行多少次這樣的操作,也就是有多少個(gè)1