HJ62 查找输入整数二进制中1的个数

发布时间 2023-07-10 23:54:20作者: 白露~

1. 题目

读题

HJ62 查找输入整数二进制中1的个数

 

考查点

 

这道题的考查点可能有以下几个方面:

  • 二进制的基本知识,如二进制的表示、转换、运算等,以及负数的补码表示方法。
  • 位运算的技巧,如如何利用与、或、异或、左移、右移等操作来实现一些常见的功能,如判断某一位是否为1、清零某一位、统计1的个数等。
  • 代码的简洁性和效率,如如何避免不必要的循环和判断,如何选择合适的数据类型和运算符,如何利用一些巧妙的公式或规律来优化算法。

2. 解法

思路

 

输入整数二进制中1的个数有几种方式实现,我给你列举一些:

  • 一种是逐位判断,即从整数的最低位开始,依次和1做与运算,如果结果为1,则说明该位是1,否则是0,然后右移一位,继续判断,直到整数变为0为止。这种方法的循环次数等于整数的二进制位数。
  • 另一种是利用n&(n-1),即每次将整数和它减去1的结果做与运算,这样可以消去最右边的一个1,直到整数变为0为止。这种方法的循环次数等于整数的二进制中1的个数。
  • 还有一种是使用bitset,即将整数转换为一个32位的二进制集合,然后调用count()函数统计其中1的个数。这种方法只需要两行代码就可以实现.

代码逻辑

 

具体实现

  • 逐位判断
public int numberOf1(int n) {
    int count = 0;
    while (n != 0) {
        // 如果最低位是1,计数加一
        if ((n & 1) == 1) {
            count++;
        }
        // 右移一位,注意要用无符号右移
        n = n >>> 1;
    }
    return count;
}
  • 利用n&(n-1):
public int numberOf1(int n) {
    int count = 0;
    while (n != 0) {
        // 每次消去最右边的一个1,计数加一
        count++;
        n = n & (n - 1);
    }
    return count;
}
  • 使用bitset:
import java.util.BitSet;

public int numberOf1(int n) {
    // 将整数转换为32位的二进制集合
    BitSet bs = BitSet.valueOf(new long[]{n});
    // 返回集合中1的个数
    return bs.cardinality();
}

 

3. 总结