二进制中1的个数
标签:进制转换 面试真题
输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。
数据范围:−231<=n<=231−1−231<=n<=231−1
即范围为:−2147483648<=n<=2147483647−2147483648<=n<=2147483647
示例1
输入:10
返回值:2
说明:十进制10的32位二进制表示为0000 0000 0000 0000 0000 0000 0000 1010,有两个1。
示例2
输入:-1
返回值:32
说明:负数用补码表示 ,-1的32位二进制表示为1111 1111 1111 1111 1111 1111 1111 1111,32个1
思路:和leetcode504.七进制数-CSDN博客看似类似,但实际思路不一样,因为七进制和二进制对于负数的表示方式不同: 七进制对于负数是先把他当作正数,然后将结果加负号即可; 二进制数对于负数是要用补码表示 。因此不能使用通用的取余操作
public int NumberOf1(int n) {int count = 0;for (int i = 0; i < 32; i++) {//&运算————先转换为二进制数,然后各个位进行与运算,这里和1(0000...00001)进行与运算即可得到最低位的数字if ((n & 1) == 1) count++;n >>= 1; // 算术右移一位,类似于除以2,但这里必须用右移,因为右移对于负数是向负无穷取整,除法是向0方向取整,这里应该用右移}return count;}