题目描述
输入一个 32 位整数,输出该数二进制表示中 1 的个数。
注意:
- 负数在计算机中用其绝对值的补码来表示。
数据范围
−100≤ 输入整数 ≤100
样例1
输入:9 输出:2 解释:9的二进制表示是1001,一共有2个1。
样例2
输入:-2 输出:31 解释:-2在计算机里会被表示成11111111111111111111111111111110, 一共有31个1。
方法一:位运算 O(logn)
这题需要用到位运算的知识:
如果 n nn 的二进制表示最后一位为 1 11 ,则 r e s resres ++ 。
每次判断完后,都将 n nn 往右移 1 11 位,即消除 n nn 的二进制表示下的最后一位。
这里需要注意的是,c++ 中如果将负数往右移一位,最高位会自动补 1 11 ,这样循环就永远不会结束。所以我们要先将数字转换成无符号整型,这样每次右移就会在最高位补 0 00 ,循环就可以结束了。
class Solution { public: int NumberOf1(int n) { int res = 0; unsigned int un = n; while (un) res += un & 1, un >>= 1; return res; } };
欢迎大家在评论区交流~