方法 1
【知识点】:
1 整数-要判断整数的正负之分
2 位操作:左移(num<<n): 直接在右边补充n个0
右移(num>>n): 正数在左边补齐n个0,负数在左边补齐n个1
3二进制位数统计:依次从二进制尾端判断当前位置的0-1情况(利用与pos&1操作),当判断倒数第二位时候(&10),倒数第三位(&100)。。。,即每次1左移1位。
4 flag的移位为程序构建的循环终止条件(33次移位后,flag变为0),循环总共执行32次。
private static int NumberOfOne(int num) {
int count=0;
int flag=1;
while(flag!=0){
if((num&flag)!=0)
count++;
flag=flag<<1;
}
return count;
}
方法 2
解题思路:
n&n-1的位操作相当于为n 消除了一个1
n-1的二进制是在n右边数第一位的1开始,此1之前的保持不变 ,此处的1变为0,此1以后的变的与原来相反。
private static int NumberOfOne2(int num) {
int count=0;
while(num!=0){
count++;
num=num&(num-1);
}
return count;
}