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

题目描述

输入一个整数,输出该数二进制表示中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;
     }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本项目是一个基于SpringBoot开发的华府便利店信息管理系统,使用了Vue和MySQL作为前端框架和数据库。该系统主要针对计算机相关专业的正在毕设的学生和需要项目实战练习的Java学习者,包含项目源码、数据库脚本、项目说明等,有论文参考,可以直接作为毕设使用。 后台框架采用SpringBoot,数据库使用MySQL,开发环境为JDK、IDEA、Tomcat。项目经过严格调试,确保可以运行。如果基础还行,可以在代码基础之上进行改动以实现更多功能。 该系统的功能主要包括商品管理、订单管理、用户管理等模块。在商品管理模块,可以添加、修改、删除商品信息;在订单管理模块,可以查看订单详情、处理订单状态;在用户管理模块,可以注册、登录、修改个人信息等。此外,系统还提供了数据统计功能,可以对销售数据进行统计和分析。 技术实现方面,前端采用Vue框架进行开发,后端使用SpringBoot框架搭建服务端应用。数据库采用MySQL进行数据存储和管理。整个系统通过前后端分离的方式实现,提高了系统的可维护性和可扩展性。同时,系统还采用了一些流行的技术和工具,如MyBatis、JPA等进行数据访问和操作,以及Maven进行项目管理和构建。 总之,本系统是一个基于SpringBoot开发的华府便利店信息管理系统,使用了Vue和MySQL作为前端框架和数据库。系统经过严格调试,确保可以运行。如果基础还行,可以在代码基础之上进行改动以实现更多功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值