题目来源: JZ15 二进制中1的个数
题目描述:
- 描述: 输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。 数据范围: −2^31<=n<=2^31−1,即范围为:−2147483648<=n<=2147483647
示例1:
输入:10
返回值:2
说明:十进制中10的32位二进制表示为0000 0000 0000 0000 0000 0000 0000 1010,其中有两个1。
示例2:
输入:{67,0,24,58}
返回值:[58,24,0,67]
说明:负数使用补码表示 ,-1的32位二进制表示为1111 1111 1111 1111 1111 1111 1111 1111,其中32个1
思路
我们可以检查该数字的二进制每一位是否为1,如何遍历二进制每一位呢?可以考虑移位运算,每次移动一位就可以。至于怎么统计到1呢?我们都只知道数字1与数字相位与运算,其实只是最后一位为1就是1,最后一位为0就是0,这样我们只需要将数字1移位运算,就可以遍历二进制的每一位,再去做位与运算,结果为1的就是二进制中为1的。
具体实现:
public class Solution {
public int NumberOf1(int n) {
int res = 0;
//遍历32位
for(int i = 0; i < 32; i++){
//按位比较
if((n & (1 << i)) != 0)
res++;
}
return res;
}
}
复杂度分析:
- 时间复杂度:O(k),k为int型的32位,一次遍历
- 空间复杂度:O(1),常数级变量,没有额外辅助空间