0%

二进制中1的个数

题目:

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

牛客网

解法思路

  1. 对于无符号数可以每次右移一位,并与1进行|运算,如果运算结果为1,则代表末位为1
  2. 对于有符号数n,每次进行一次n & (n-1)运算都会将n的二进制表示中最后一个1替换为0

本文的方法采用的是第二种解法。

对于正数6来说,二进制表示为00000110,5的二进制表示为0000010100000110&00000101的运算结果为00000100

负数以补码的形式存储,-6的二进制表示为11111010,-7的二进制表示为1111100111111010&11111001的运算结果为11111000

循环结束后,二进制表示中的1全部被替换为0。

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public:
int NumberOf1(int n) {
int num = 0;
while (n) {
num++;
n &= (n -1);
}
return num;
}
};
请作者喝咖啡