• 题目描述:

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

  • 分析:

    作为渣渣,这个题我一开始真没想到用位运算。。
    首先,说到二进制,就应该想到二进制的各种运算:按位与运算(&)、按位或运算(|)、按位异或运算(^)、按位取反(~)。再看题目,要求二进制表示中1的个数,既然要求1的个数,那就是说要看这个二进制数的每一位是不是1,所以可以想到,用1去和二进制数里的每一位进行与(&)运算即可,因为1&1的1,1&0得0。

    接下来说两种思路
    思路1:右移
    用输入整数的最后一位和1进行与运算,结果为1则递增计数器;然后将整数右移,此时整数的最后一位即原整数的倒数第二位,继续与1进行与运算;直到整数变为0。
    但是这个思路有一个bug,对于负数,右移过程中,最高位将自动补1!这样的话,当右移次数超过31次的时候,这个整数将变为0xFFFFFFFF(说到这再补一下32位整型的范围:0x7FFFFFFF~0x80000000,根本提无关,单纯复习),此时会进入死循环。
    但是,这种思路也不是不可用,只要在右移时让其最高位不补1而是补0就好了,也就是所谓的逻辑位移。当然,为了简便,也完全没必要特意写个逻辑位移函数出来,还有两种方法:一是可以直接用位移次数来控制循环;二是先判断正负,如果是负数先把计数器加1,记录符号位的1,然后再把最高位置0,剩下的就可以直接进行右移了。

    code:

    int NumberOf1(int n) {int count = 0;for(int i = 0; i < 32; ++i){if(n & 1)++count;n >>= 1;}return count;
    }
    

    思路2:左移
    既然右移输入的整数容易陷入死循环,那么左移1就好了,每左移一次1求与运算,就相当于向整数的前一位求与。

    code:

    int  NumberOf1(int n) {int count = 0;unsigned int flag = 1;while(flag){if(n & flag)++count;flag <<= 1;}return count;
    }
    

转载于:https://www.cnblogs.com/Bill-LHR/p/6769505.html

位运算:二进制中1的个数相关推荐

  1. 判断32位整数二进制中1的个数

    在面试中被问到这一题:判断32位无符号整数二进制中1的个数,虽然不难,但要求层层优化.现在整理一下: 1.基本思路: #include <iostream> using namespace ...

  2. 剑指 Offer 15. 二进制中1的个数 + 191. 位1的个数(n(n-1)实例)

    一.题目:剑指 Offer 15. 二进制中1的个数 请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此, ...

  3. 《剑指offer》第十五题(二进制中1的个数)

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

  4. 剑指offer:面试题15. 二进制中1的个数

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

  5. 每列大于0的个数_二进制中1的个数(剑指offer第十四天)

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

  6. 【剑指offer-Java版】10二进制中1的个数

    二进制中1的个数: 思路一:循环右移给定的数,但是存在负数出现死循环的问题 思路二:声明一个变量flag并初始化为1,然后循环右移flag,循环次数是和给定数的精度也就是位数有关 思路三:用了二进制一 ...

  7. 编程之美2.1 求二进制中1的个数

    最近一段的时间,一直在看编程之美之类的算法书籍,刚开始看编程之美,感觉到难度太大,有时候也不愿意去翻动这本书,不过,经过一段时间的修炼,我也彻底的喜欢上这本书了, 书中的算法涉及到很多方面,树,链表, ...

  8. [剑指Offer]12.二进制中1的个数

    题目 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路 把一个整数减去1,再和原整数做与运算,会把整数最右边一个1变成0.那么一个整数的二进制表示中有多少个1,就可以进行多次这样 ...

  9. 第2章 数字之魅——求二进制中1的个数

    求二进制中1的个数 问题描述 对于一个字节(8bit)的变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高. [解法一] 可以举一个八位的二进制例子来进行分析.对于二 ...

  10. 剑指Offer #11 二进制中1的个数(想不到的骚操作)

    题目来源:牛客网-剑指Offer专题 题目地址:二进制中1的个数 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 题目解析 对于这种涉及位运算的题目,我们首先要了解基本的位 ...

最新文章

  1. ps怎么把一个颜色替换成另一个颜色_图标设计,用PS制作一款小清新的拟物时钟...
  2. 【git效率篇】在window上面的git bash 配置永久别名 快捷方式
  3. python编程爱心-用python 打印出爱心
  4. java 协程框架_GitHub - yaozhang0105/dactor: Dactor是基于Java的轻量级同步异步统一处理框架,基于协程思想构建...
  5. win8: hello gril
  6. request用法_3分钟短文:说说Laravel页面会话之间的数据保存Session用法
  7. 【转载】图片 CSS:怎样才能 “响应式 + 固定宽高比例”?
  8. Android学习笔记06---电话拨号器的制作:项目结构深化
  9. Mysql 引优化分析
  10. Spark SQL从入门到精通
  11. 2.1 数字图像处理——图像基础
  12. Oracle 11g 下载安装
  13. python小明爬楼梯_Python两种方法求解登楼梯问题(京东2016笔试题)
  14. Python三个数字排列大小
  15. 【历史上的今天】4 月 4 日:互联网新时代的缔造者出现;微软成立;苹果公司元老诞生
  16. 文化产业如何面对大数据时代
  17. 想从动物科学转专业去计算机,动物科学转专业或者加第二专业动物医学,望老师同学们提些建议。...
  18. 基于版面排版设计的一个新闻类网站构建
  19. DP地狱训练 挤牛奶
  20. 25-基于51单片机温湿度的检测及控制的设计

热门文章

  1. 将房子卖了五百万,存在银行,靠利息能过日子吗?
  2. 人穷的时候,最看不起自己的是谁?
  3. 扎的多音字组词有哪些
  4. 大部分人其实根本就不上进,他们只是表现的很努力
  5. The single product is priced at about 1350 yuan
  6. 用SAX2方式解析XML
  7. TCP协议特点和TCP报文段
  8. 安装netca_安装oracle 10g rac上的那些拦路虎
  9. cte sql_为什么我的CTE这么慢?
  10. xposed 主动调用方法_操作方法:主动容量管理