题目链接:二进制中1的个数
题意:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
题解:
1、很容易想到每次做&运算,然后判断结果是否为0来判断是否有1。
2、去讨论区看了下第一个方法效率太低。
第二个方法就是让每次让n & n-1。我刚开始没懂举了个例子。
n = 1100
1100 - 1 = 1011 1100&1011 = 1000
1000 - 1 = 0111 1000 & 0111 = 0000
从上可得,每次-1操作是使'1'位被借走,再和原来的&会使被借位的1变成0。
也就是我们每次做这个操作的时候都会使数字里的1变成0,那么只要全为0,这个1的个数就找出来了。
代码:
1 class Solution { 2 public: 3 int NumberOf1(int n) { 4 int cnt = 0; 5 int flag = 1; 6 while(flag >= 1 || flag <= -1){ 7 if(( n & flag) != 0){ 8 cnt++; 9 } 10 flag <<= 1; 11 } 12 return cnt; 13 } 14 }; 15 16 17 18 class Solution { 19 public: 20 int NumberOf1(int n) { 21 int cnt = 0; 22 while(n){ 23 n = n&(n-1); 24 cnt++; 25 } 26 return cnt; 27 } 28 };