解法1:无符号右移法
public class Solution {
public int NumberOf1(int n) {
//n是用补码表示的
//当成二进制数进行无符号右移
int max=0;
while(n!=0){
if((n&1)==1){
//&操作 1011 1111 & 0000 0001 可以看出最后一位为1则结果为1,最后一位为0则结果为0
max++;
}
//无符号右移一位,最高位补0
n=n>>>1;
}
return max;
}
}解法2: 最右位1移除法
public class Solution {
public int NumberOf1(int n) {
//来个高级解法
int max=0;
while(n!=0){
max++;
//求最右1的位置
int rightOne= n&(~n+1);
//将最右位置1变为0
n=n^rightOne;
}
return max;
}
}解法3: 还是官方的更胜一筹
public class Solution {
public int NumberOf1(int n) {
//w还是输给了官方
int max=0;
while(n!=0){
max++;
n=n&(n-1);
}
return max;
}
}
京公网安备 11010502036488号