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. 总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)