位运算:二进制中1的个数
- 题目描述:
输入一个整数,输出该数二进制表示中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的个数相关推荐
- 判断32位整数二进制中1的个数
在面试中被问到这一题:判断32位无符号整数二进制中1的个数,虽然不难,但要求层层优化.现在整理一下: 1.基本思路: #include <iostream> using namespace ...
- 剑指 Offer 15. 二进制中1的个数 + 191. 位1的个数(n(n-1)实例)
一.题目:剑指 Offer 15. 二进制中1的个数 请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此, ...
- 《剑指offer》第十五题(二进制中1的个数)
// 面试题:二进制中1的个数 // 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如 // 把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. #inclu ...
- 剑指offer:面试题15. 二进制中1的个数
题目:二进制中1的个数 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 示例 1: 输 ...
- 每列大于0的个数_二进制中1的个数(剑指offer第十四天)
二进制中1的个数 题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 示例 1: 输 ...
- 【剑指offer-Java版】10二进制中1的个数
二进制中1的个数: 思路一:循环右移给定的数,但是存在负数出现死循环的问题 思路二:声明一个变量flag并初始化为1,然后循环右移flag,循环次数是和给定数的精度也就是位数有关 思路三:用了二进制一 ...
- 编程之美2.1 求二进制中1的个数
最近一段的时间,一直在看编程之美之类的算法书籍,刚开始看编程之美,感觉到难度太大,有时候也不愿意去翻动这本书,不过,经过一段时间的修炼,我也彻底的喜欢上这本书了, 书中的算法涉及到很多方面,树,链表, ...
- [剑指Offer]12.二进制中1的个数
题目 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路 把一个整数减去1,再和原整数做与运算,会把整数最右边一个1变成0.那么一个整数的二进制表示中有多少个1,就可以进行多次这样 ...
- 第2章 数字之魅——求二进制中1的个数
求二进制中1的个数 问题描述 对于一个字节(8bit)的变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高. [解法一] 可以举一个八位的二进制例子来进行分析.对于二 ...
- 剑指Offer #11 二进制中1的个数(想不到的骚操作)
题目来源:牛客网-剑指Offer专题 题目地址:二进制中1的个数 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 题目解析 对于这种涉及位运算的题目,我们首先要了解基本的位 ...
最新文章
- ps怎么把一个颜色替换成另一个颜色_图标设计,用PS制作一款小清新的拟物时钟...
- 【git效率篇】在window上面的git bash 配置永久别名 快捷方式
- python编程爱心-用python 打印出爱心
- java 协程框架_GitHub - yaozhang0105/dactor: Dactor是基于Java的轻量级同步异步统一处理框架,基于协程思想构建...
- win8: hello gril
- request用法_3分钟短文:说说Laravel页面会话之间的数据保存Session用法
- 【转载】图片 CSS:怎样才能 “响应式 + 固定宽高比例”?
- Android学习笔记06---电话拨号器的制作:项目结构深化
- Mysql 引优化分析
- Spark SQL从入门到精通
- 2.1 数字图像处理——图像基础
- Oracle 11g 下载安装
- python小明爬楼梯_Python两种方法求解登楼梯问题(京东2016笔试题)
- Python三个数字排列大小
- 【历史上的今天】4 月 4 日:互联网新时代的缔造者出现;微软成立;苹果公司元老诞生
- 文化产业如何面对大数据时代
- 想从动物科学转专业去计算机,动物科学转专业或者加第二专业动物医学,望老师同学们提些建议。...
- 基于版面排版设计的一个新闻类网站构建
- DP地狱训练 挤牛奶
- 25-基于51单片机温湿度的检测及控制的设计