剑指Offer面试题:8.二进制中1的个数建议收藏

一题目:二进制中1的个数二可能引起死循环的解法00001010>>2=0000001010001010>>3=11110001那么,问题来了:上面的方法如果输入一个

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

一 题目:二进制中1的个数

题目:请实现一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。

二 可能引起死循环的解法

// 计算整数的二进制表示中1的个数
int CalcOneNumInBinary(int nVal)
{
    int nCount = 0;
    while (nVal > 0)
    {
        if (1 == (nVal & 1))
        {
            nCount ++;
        }

        nVal = nVal >> 1;
    }
    return nCount;
}

PS:右移运算符m>>n表示把m右移n位。右移n位的时候,最右边的n位将被丢弃。
如果数字原先是一个正数,则右移之后在最左边补n个0;如果数字原先是负数,则右移之后在最左边补n个1。例如下面对两个八位二进制数进行右移操作:

00001010>>2=00000010

10001010>>3=11110001

那么,问题来了:上面的方法如果输入一个负数,比如0x80000000,如果一直做右移运算,最终这个数字就会变成0xFFFFFFFF而陷入死循环

三 避免死循环的解法

  为了避免死循环,我们可以不右移输入的数字i:

  (1)首先把i和1做与运算,判断i的最低位是不是为1。

  (2)接着把1左移一位得到2,再和i做与运算,就能判断i的次低位是不是1。

  (3)这样反复左移,每次都能判断i的其中一位是不是1。

int CalcOneNumInBinary_1(int nVal)
{
    int nCount = 0;
    int nFlag = 1;
    while (nFlag > 0)
    {
        if ((nVal & nFlag) > 0)
        {
            nCount ++;
        }

        nFlag = nFlag << 1;
    }
    return nCount;
}

四 高效新颖解法

int NumberOf1Solution3(int n)
    {
        int count = 0;

        while (n > 0)
        {
            count++;
            n = (n - 1) & n;
        }

        return count;
    }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120167.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux终端定时器实验报告,定时器实验报告.doc

    linux终端定时器实验报告,定时器实验报告.doc定时器实验报告实验六 定时器/计数器一、实验目的⒈ 学会8253芯片和微机接口的原理和方法。掌握8253定时器/计数器的工作方式和编程原理。二、实验内容用8253的0通道工作在方式3,产生方波。三、实验接线图四、编程指南⒈ 8253芯片介绍8253是一种可编程定时/计数器,有三个十六位计数器,其计数频率范围为0-2MHz,用+5V单电源供电。8253的功能用途:延时中断 实时时钟可编程频率发…

    2022年7月26日
    14
  • javascript实例教程(17) 使用javascript的数学函数

    javascript实例教程(17) 使用javascript的数学函数 javascript实例教程(17)使用javascript的数学函数在JavaScript中,数学方法可以分成以下几类:constans(常数)、powerfunctions(乘方函数)、trigonometicfunctions(三角函数)、roundingfunctions(舍入函数)以及randomnumbers(随机数字)。下面逐个说明:常数和乘方函数Math.E

    2022年7月16日
    19
  • 【温故而知新】C和C++篇外篇:COleVariant类型「建议收藏」

    【温故而知新】C和C++篇外篇:COleVariant类型「建议收藏」今天在做一个windows平台的小工具顺便熟悉一下windows开发的一些基础知识,在这个过程中,发现了

    2022年7月18日
    12
  • 搭建Eurake集群

    搭建Eurake集群eureka作为SpringCloud的服务发现与注册中心,在整个的微服务体系中,处于核心位置。单一的eureka服务,显然不能满足高可用的实际生产环境,这就要求我们配置一个能够应对各种突发情况,具有较强容灾能力的eureka集群服务。其实我们只需要在部署时候,对eureka的配置文件做相应的修改,运行即可。在项目中,创建三个名字分别为eureka01,eureka02,eureka03的eur…

    2022年6月4日
    39
  • Vue刷新页面的三种方式[通俗易懂]

    Vue刷新页面的三种方式[通俗易懂]我们在写项目的时候,经常会遇到,用户执行完某个动作,改变了某些状态,需要重新刷新页面,以此来重新渲染页面。如:用户登录成功、增加、删除、更新等。原始方法:location.reload();vue自带的路由跳转:this.$router.go(0);用过的人都知道,前两者都是强制刷新页面,会出现短暂的闪烁,用户体验效果不好。所以,我们选择第三种方式:3.首先在App里面…

    2022年10月17日
    3
  • eclipse 导入父子工程_eclipse 导入maven 父子项目

    eclipse 导入父子工程_eclipse 导入maven 父子项目你先要确认svn上是否是maven项目,否则要自己重新建一个maven项目然后直接引入目录了。如果确认是maven项目,那么有个两个方案。案一:先用任何client软件将svn下载。然后在eclipse选择import,然后当作existmavenproject导入。案二:在project中有checkoutmavenfromscm。scm就是指版本控制软件。不过不同版本控制的sc…

    2022年5月6日
    247

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号