题目要求
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
核心思路
- 如果一个整数不为0,那么这个整数至少有一位是1,如果把这个整数减1,那么原来整数最右边的1就会变为0,原来在1右边的所有0都会变为1。那么,利用n = n & (n - 1),如1100 & 1011 = 1000,也就是说,把整数减1,再和原数进行与运算,就会消去一个1。利用这个特性我们就可以算出1的个数。
- 把整数转换为二进制字符串,把字符串转为char数组,再进行遍历计算。
完整代码如下
/**
*输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
*/
public class Solution {
//核心思想:n = n & (n-1)
public int NumberOfOne1(int n) {
if(n == 0)
return 0;
int count = 0;
while(n != 0) {
n = n & (n-1);
count++;
}
return count;
}
//核心思想:字符串数组
public int NumberOfOne2(int n) {
int count = 0;
char[] charArray = Integer.toBinaryString(n).toCharArray();
for (int i = 0; i < charArray.length; i++) {
if (charArray[i] == '1') {
count++;
}
}
return count;
}
public static void main(String[] args) {
Solution sl = new Solution();
System.out.println(sl.NumberOfOne1(5));
System.out.println(sl.NumberOfOne2(5));
}
}