题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
leetcode对应:191、位1的个数
思路:将数字num做减一运算,这样会使得数字num最右侧的1变成0,此时再和原来的数字num做&运算,这样num在二进制下原始最右侧的1消除,循环下去,一直到num为0停止,可以计数出num中二进制表示下所有的1的个数。
拓展:
用一句话判断一个整数是不是2的整数次方。
答:如果一个整数是2的整数次方,那么数字二进制表示中1的个数只有一。所以n&(n-1) = 0.
输入两个整数m和n,需要改变m二进制表示中多少位才能变成n。先将m和n做异或操作,可以得到一个二进制表示的数,数中的1的个数表示有多少位不同,然后统计这个数二进制表示中1的个数。
TIPS:
n&(n-1),把一个整数减1之后和原数做&运算,得到的结果相当于把整数的二进制表示最右边的1变成0.
class Solution {
public:
int NumberOf1(int n) {
int cnt = 0;
while(n!=0){
cnt++;
n = (n-1)&n;
}
return cnt;
}
};