[编程题]二进制中1的个数
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
代码如下:
/*
* 1.右移一位相等于除以2,但是不能用除法替代右移
* 因为除法的效率比移位运算要低得多,在实际编程中应尽可能地用移位算法替代乘除法
*
*
*/
public class Demo2 {
public static void main(String[] args) {
// System.out.println(solve1(15));
System.out.println(solve2(-15));
// System.out.println(Integer.toBinaryString(-15));
}
// 只能计算正数,负数会产生死循环
public static int solve1(int n) {
int count = 0;
while (n != 0) {
if ((n & 1) == 1)
count++;
n = n >> 1;
}
return count;
}
// 巧妙的解法:把一个整数减去1,再和原来的整数进行与运算
// 会把该整数最右一个1变成0
// 负数必须用补码表示!
private static int solve2(int n) {
int count = 0;
while (n != 0) {
count++;
n = n & (n - 1);
}
return count;
}
}