参考大佬文章:http://blog.youkuaiyun.com/jsqfengbao/article/details/47143127
要点:
1.整数除2相当于>>1,整数乘1相当于<<1.
2.除法要比位运算效率低,因为除法也是调用的位运算。
3.循环右移位运算的解法,当整数为负数时,由于负数最左边是符号位1,所以第一种代码写法会造成死循环。
4.整数num*(num-1)相当于整数二进制形式最右边的1变成0;
参考代码:
public class test1 {
/**
* 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1,因此如果输入9,该函数输出2.
* @param args
*/
public static void main(String[] args){
System.out.println(calcOneNum1(10));
}
public static int calcOneNum(int x){
int flag=1;
int count=0;
while(flag!=0){
if((x&flag)!=0){
count++;
}
flag=flag<<1;
}
return count;
}
public static int calcOneNum1(int x){
int count=0;
while(x!=0){
count++;
x=x&(x-1);
}
return count;
}
}