(function(){
function getOne(n) {
var c = 0;
for(var i = 0;i < 32;i ++){
if(((1 << i) & n) != 0){
c++;
}
}
return c;
}
console.log(getOne(10));
console.log(getOne(-10));
})();
//比较最低位是否为1,复杂度O(logn),仅适合正数,当是负数,将出现死循环
function getOne(n){
var c = 0;
while(n){
if(n&1){
c ++;
}
n >>= 1;
}
return c;
}
//同上,适合所有的数
function getOne(n){
var c = 0;
while(n != 0){
if((n & 1) != 0){
c++;
}
n >>>= 1;
}
return c;
}
function getOne(n) {
var c = 0;
for (var i = 1; i; i <<= 1) {
if (i & n) {
c++;
}
}
return c;
}
//int类型的是32位的数字,故只需要统计这32位上的数字的1的个数
function getOne(n) {
var c = 0;
for(var i = 0;i < 32;i ++){
if(((1 << i) & n) != 0){
c++;
}
}
return c;
}
//快速去掉最低位1
function getOne(n){
var c = 0;
while(n){
n = n &(n - 1);
c++;
}
return c;
}
public class BinaryOneCount {
public static void main(String[] args) {
new BinaryOneCount().start();
}
private void start() {
int n = -10;
countOne(n);
countOne(n = 10);
countOne(n = 103);
countOne(n = 30);
}
private void countOne(int n) {
System.out.println(Integer.toBinaryString(n));
System.out.println(Integer.bitCount(n));
countBinaryOneBit(n);
countBinaryOneBit1(n);
countBinaryOneBit2(n);
}
/**
* 查看当前最低位是否为1,是加1,否则就将当前数字无符号左移1位,进行下一轮判断
* @param n
*/
private void countBinaryOneBit(int n) {
int c = 0;
while (n != 0) {
if ((n & 1) != 0) {
c++;
}
n >>>= 1;
}
System.out.println(c);
}
/**
* 每次循环将最低位1去掉,这样进行的次数就是1的个数
* @param n
*/
private void countBinaryOneBit1(int n) {
int c = 0;
while (n != 0) {
n &= (n - 1);
c++;
}
System.out.println(c);
}
/**
* 由于是32位的Int类型的数字,故只需要统计这32位上的数字1的个数
* @param n
*/
private void countBinaryOneBit2(int n){
int c = 0;
for(int i = 0;i < 32;i ++){
if((n&(1<<i)) != 0){
c ++;
}
}
System.out.println(c);
}
}