题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
负数的补码:减一取反 或者 取反加一
int 类型的范围是-231 ~ 231-1
我的做法:麻烦还不对
class Solution { public: int NumberOf1(int n) { if(n == 0) return 0; int num = 0; int con = n; bool flag = false; if(n % 2 == 1) num++; n = n/2; if(num == 1) flag = true; while(n) { if(n % 2 == 1) num++; n = n/2; } if(con > 0) return num; else { if(flag) return 15-num+1+1; else return 15-num+1; } } };
正确解法:
class Solution { public: int NumberOf1(int n) { int count=0; unsigned int flag=1; while(flag){ if (n & flag){ count++; } flag=flag<<1; } return count; } };
或者:
class Solution { public: int NumberOf1(int n) { int count = 0; while (n != 0) { ++count; n = (n - 1) & n; } return count; } };