方法一:
class Solution {
public:
int NumberOf1(int n) {
int num=0;
while(n!=0){
n=n&(n-1);
num++;
}
return num;
}
};
方法二:
对于负数,最高位为1,而负数在计算机是以补码存在的,往右移,符号位不变,符号位1往右移,最终可能会出现全1的情况,导致死循环。与0x7fffffff相与,就可以消除负数的影响.
若不处理负数会出现运行超时的现象(死循环)
class Solution { public: int NumberOf1(int n) { int num=0; if(n<0){ n=n&0x7fffffff; num++; } while(n!=0){ num+=n&1; n=n>>1; } return num; } };
两种方法的利弊比较:
n一个一个减一去&太麻烦,如果n很大会很浪费时间。还是右移比较快。但是右移涉及到负数。因为计算机的右移是算术右移,最高位补符号位,故-1会陷入死循环。