看了很多計(jì)算二進(jìn)制中1的個(gè)數(shù)的算法拆内,基本所有算法都是基于二進(jìn)制的位運(yùn)算,早上想了想归苍,覺(jué)得可以換個(gè)簡(jiǎn)單的角度去想這個(gè)問(wèn)題用狱。
十進(jìn)制轉(zhuǎn)換二進(jìn)制(正數(shù))除二取余,根據(jù)這個(gè)轉(zhuǎn)換方式我們就能計(jì)算出有多少個(gè)1
private int countPlus(int n) {
int count = 0;
while (n > 0) {
count += n % 2;
n = n / 2;
}
return count;
}
但這只是針對(duì)于正數(shù)拼弃,那么負(fù)數(shù)怎么算呢夏伊?負(fù)數(shù)轉(zhuǎn)二進(jìn)制是其絕對(duì)值除二取余取反加一,其實(shí)也就不難發(fā)現(xiàn)負(fù)數(shù)二進(jìn)制與正數(shù)二進(jìn)制的關(guān)系: -2是1的反碼 -3是2的反碼... 負(fù)數(shù)其實(shí)就是它絕對(duì)值減一再取反即 (-1) + (取反) = (取反)+(1)
那么負(fù)數(shù)二進(jìn)制的1的個(gè)數(shù)也可以參考正數(shù)的方式吻氧。完整代碼如下:
public class Count {
public int count(int n) {
return n >= 0 ? countPlus(n) : countMinus(n);
}
private int countPlus(int n) {
int count = 0;
while (n > 0) {
count += n % 2;
n = n / 2;
}
return count;
}
private int countMinus(int n) {
int count = 32;
n = -n - 1;
return count - countPlus(n);
}
}
如有不對(duì)或是建議望指出溺忧。