二进制中1的个数(剑指Offer 第 11 题)

本文介绍两种高效方法计算整数(包括负数)二进制表示中1的个数:使用Java API转换为二进制字符串并计数,以及利用位运算符进行迭代计算。

题目描述:


输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。


解题思路


主要介绍3种方法:

  1. Java API
  2. &运算符

1 . Java API

Integer.toBinaryString(10);//得到10的二进制表示的字符串表示 "1010"
Integer.toBinaryString(-10);//得到是补码的形式表示"11111111111111111111111111110110" (4个字节) 

//判1的个数,可以遍历判断,也可以subString(x,x+1)来判断第x位的。

//遍历判断
for(int i=0; i<s.length(); i++){
    if(s.charAt(i)=='1')
    count++;
}

//subString判断
for(int x=0; x<s.length(); x++){
    if(s.subString(x,x+1)=='1')
    count++;
}

具体Java代码实现在下面模块。


2 . & 运算

先介绍 & 运算符
看个例子:
10 & 1 => 二进制 1010 & 0001 = 0000 =>十进制 0
10 & 2 => 二进制 1010 & 0010 = 0010 =>十进制 2
10 & 4 => 二进制 1010 & 0100 = 0000 =>十进制 0
10 & 8 => 二进制 1010 & 1000 = 1000 =>十进制 8

我们可以观察到 &运算符 就是 左右两个数的二进制表示之后再对相同的位进行比较,比较规则是与规则,有0为0,全1为1。
其实,在上面我们不知不觉就把10的二进制表示1的个数求出来了,我们观察到 &运算结果 不为0 的相应位都是1,例子中1的个数为2 (10 的二进制 1010 , 1的个数就是2)。

当然,这种做法,对于负数一样是有效的,由于 &运算符 会自动将负数用补码进行表示,所以我们完全不用担心!

那木,具体怎么实现上面的方法呢?
观察上面例子中,&运算符右边的数的变化,是不是1一直在不断的左移一位啊!
其实我们完全可以等效的来表示:

    10 & 1 => 二进制 1010 & 0001 = 0000 
10>>>1 & 1 => 二进制 0101 & 0001 = 0001 
10>>>2 & 1 => 二进制 0010 & 0001 = 0000 
10>>>3 & 1 => 二进制 0001 & 0001 = 0001 

先解释下 >>>运算符,其表示无符号右移相应位,就是二进制右移相应位数之后,左边全部补0。
上面的等价是相对的思想,让&运算符右边的不动,左边的动,达到同样的效果,虽然计算结果不同,但是是否为0完全能够判断出来!也就是不是1完全能够判断出来!

具体实现如下:

int num = 10;
int count = 0;
do{
    if((num & 1) != 0)
        count++;
    num>>>=1;
}while(num != 0);

以上2种方法的完整Java代码:


Java API


public class Solution {
    public int NumberOf1(int n) {
        int count = 0;
        String s = Integer.toBinaryString(n);
        for(int i=0; i<s.length(); i++){
            if(s.charAt(i)=='1')
                count++;
        }

        return count;
    }
}

& 运算符


public class Solution {
    public int NumberOf1(int n) {
        int count = 0;
        do{
            if((n & 1) != 0)
                count++;
            n >>>= 1;
        }while(n != 0);

        return count;
    }
}

End

内容概要:本文系统梳理了多个科研领域的前沿研究与技术实现,重点涵盖FDTD方法中的完美匹配层(PML)研究,以及Matlab/Simulink在电磁、电力、控制、通信、信号处理、图像处理、路径规划、能源系统优化等领域的仿真与算法实现。文中列举了大量基于Matlab和Python的科研案例,如风电功率预测、负荷预测、无人机三维路径规划、电池系统故障诊断、雷达模拟、通信编码、微电网优化调度等,强调结合智能优化算法(如粒子群、遗传算法、深度学习等)提升系统性能。同时,提供了丰富的代码资源与仿真模型,涵盖永磁同步电机控制、逆变器设计、多智能体任务配、虚拟电厂调度等复杂系统,助力科研人员快速开展复现实验与创新研究。; 适合人群:具备一定编程基础,熟悉Matlab/Python工具,从事电气工程、自动化、通信、人工智能、新能源、控制科学等相关领域研究的研发人员及研究生。; 使用场景及目标:① 学习实现FDTD仿真中的PML边界条件以有效抑制数值反射;② 掌握Matlab/Simulink在多物理场建模、控制系统设计与优化算法中的综合应用;③ 借助提供的代码资源完成科研复现、课程设计、竞赛项目或工程原型开发; 阅读建议:此资源以科研实战为导向,不仅提供理论方法,更强调代码实现与仿真验证。建议读者结合自身研究方向,按目录顺序查阅相关模块,下载配套代码进行调试与二次开发,以达到学以致用、融会贯通的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值