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. 总结
标签:count,右移,二进制,个数,整数,int,查找,HJ62 From: https://www.cnblogs.com/shoshana-kong/p/17478496.html