题目描述
输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
方法一:二进制移位法
class Solution {
public:
int NumberOf1(int n) {
int ans = 0;
int mark = 0x01;
while(mark != 0){
if(mark & n) ++ans;
mark <<= 1;
}
return ans;
}
};
为什么不是n向右移?因为,对于负数的补码,右移会在高位补1,而不是0.
方法二:巧妙解法
class Solution {
public:
int NumberOf1(int val) {
int ans = 0;
while(val != 0){
++ans;
val = val & (val - 1);
}
return ans;
}
};
思路:
考虑二进制数:val :1101000, val-1: 1100111 那么val & (val-1) : 1100000
172

被折叠的 条评论
为什么被折叠?



