二进制中1的个数
这道题是剑指offer第15道题
题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
第一种思路:我们通过对这个数的二进制每一位和1进行“与运算”,如果为1,那么就累加1的个数
如对于十进制5:二进制为101,我们通过其每个位与二进制数1,10,100进行与运算,那么也就是对于二进制1,不断地进行左移,就可以出现1,10,100,1000等的数。但是存在一个问题,我们不知道这个数的二进制有多少位,就存在32位的一个溢出直至为0。
代码如下:
public class Solution {
public int hammingWeight(int n) {
int sum=0;//记录1的个数
int temp=1;//用来n的每一位是否是1 如temp=1、10、100
while(temp!=0){
sum=(n&temp)!=0?sum+1:sum;//如果为零sum就加一
temp=temp<<1;//temp左移,从n的最低位向最高位进行与运算
}
return sum;
}
}
第二种思路:通过n = n&(n-1),将这个数从右往左数的第一个位置的1消除
public class Solution1 {
public int NumberOf1(int n) {
int sum=0;//记录1的个数
while(n!=0){ // 说明当前n的二进制表示中肯定有1
sum++;
n = n&(n-1);// 本质上就是消除从右往左数的第一个位置的1
}
return sum;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界