剑指offer面试题15——二进制中1的个数

本文探讨了计算整数二进制表示中1的数量的三种方法,包括可能导致死循环的简单位移法、常规的左移位判断法以及更高效的减一与运算法。深入解析了各种方法的工作原理及优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

题目分析

1、可能引起死循环的解法:

基本思路:先判断整数二进制表示中最右边一位是不是1,接着把输入的整数右移一位,此时原来处于从右边数起第二位被移到最右边了,再判断是不是1,这样每移次动一位,知道整个整数变成0为止。

那么,如何判断一个整数的最右边是不是1呢? 如果一个整数与1做与运算的结果是1,则表示该整数最右边一位是1,否则是0。

//每次判断最高位,右移
int NumberOf1(int n){
    int count = 0;
    while(n){
        if(n & 1)
            count++;
        n = n >> 1;
    }
    return count;
}

注意:(1)把整数右移一位相当于把整数除以2,因为除法的效率比移位运算低得多,在编程中尽量使用移位代替乘除法。

(2)如果输入一个负数,如果最高位是1,右移时并不是简单地把最高位的1移到第二位,这是因为移位前是一个负数,仍然要保证移位后还是一个负数,所以移位后的最高位会设为1。如果一直右移,可能会陷入死循环,变成了0xFFFFFFFF。

2、常规解法:

首先把n和1做位与运算,判断n的最低位是不是1,接着把1左移一位得到2,再和n做与运算,判断n的次低位是不是1。这样反复左移。

//先判断n的最低位, 左移
class Solution {
public:
     int  NumberOf1(int n) {
         int count = 0;
         unsigned int flag = 1;
         while(n){
             if(n & flag)
                 count++;
             flag = flag << 1;
         }
         return count;
     }
};

循环次数等于整数二进制的位数(如32位)。

3、更好的解法:(整数中有几个1就只需要循环几次)

把一个整数减去1,都是把最右边的1变成0,如果他的右边还有0,则所有的0都变成1,而他左边的所有位都保持不变。把一个整数减去1再和原整数做与运算,相当于把它最右边的1变成0。

思路:把一个整数减去1,再和原整数做与运算,会把该整数最右边的1变成0.那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。

class Solution {
public:
     int  NumberOf1(int n) {
         int count = 0;
         while(n){
             ++count;
             n = (n-1) & n;
         }
         return count;
     }
};

 

内容概要:该研究通过在黑龙江省某示范村行24小时实地测试,比较了燃煤炉具自动/手动料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、COSO2的排放(自动料分别降低41.2%、54.3%、40.0%;手动料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算结果可视化,一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征技术改方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析模拟,揭示了生物质炉具在实际应用中的优点挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改方向政策建议,如优化料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值