判断一个整数转换成二进制后1的个数
来源:互联网 发布:一个端口的tcp连接数 编辑:程序博客网 时间:2024/06/09 11:32
判断一个整数转换成二进制后1的个数,大致有三种方法,分别是左移位、右移位和与运算。
第一种方法:右移位
右移位的基本思路是,先将整数转换成正整数,再将该数与1进行与运算。若不将整数做取绝对值处理,当输入的数是负数时,每向右移动一位,高位会自动补1,就会导致死循环。
int ChargeOnesCountInNum1(int iNum){int iCount=0;iNum = abs(iNum);//注意添加上了绝对值while(iNum){if (iNum & 1){++iCount;}iNum = iNum >> 1;}return iCount;}
第二种方法:左移位
左移位的基本思路和右移位相同。
int ChargeOnesCountInNum2(int iNum){int iCount=0;unsigned int iFlag = 1;iNum = abs(iNum);//注意添加上了绝对值</span>while(iFlag){if (iNum & iFlag){++iCount;}iFlag = iFlag << 1;}return iCount;}
第三种方法:与运算
将一个整数减去1之后,其对应的二进制中最右边的一个1会变为0,若其后存在0,则其之后的所有0都会变为1。基于此,设一个整数为n,则 n & (n-1)之后,会消掉n对应的二进制的最右边的1。因此,将一个数中所有1消掉所用的次数,即为该整数对应的二进制中1的个数。
int ChargeOnesCountInNum3(int iNum){int iCount=0;iNum = abs(iNum);//注意添加上了绝对值while(iNum){++iCount;iNum = iNum & (iNum-1);}return iCount;}左移位或者是右移位,while循环执行的次数取决于计算机的位数,32位的计算机就执行32次,而64位则要执行64次。而与运算的方法执行的次数,只与该数中1的个数有关。因此与运算方法,是三种方法中最好的一个。
相关的变形问题
- 用一条语句判断一个整数是不是2的整数次方。参考答案:if ( !(iN & (iN-1)) ){}
- 输入两个整数m和n,计算m和n对应的二进制中有多少个不同的位。参考思路:先对m和n进行异或,然后计算异或后的二进制结果中1的个数。
《剑指Offer》
0 0
- 判断一个整数转换成二进制后1的个数
- 判断一个整数转换成二进制后1的个数
- 一个整数变为二进制后1的个数
- 计算一个整数转换为二进制含有1的个数
- 快速判断整数二进制1的个数
- 一个整数二进制中1的个数
- 统计一个整数二进制1的个数
- 整数转换为二进制数后,所含1的个数
- 反转一个字节 和 判断32位整数二进制中1的个数 的算法
- 反转一个字节 和 判断32位整数二进制中1的个数 的算法(ZZ)
- 反转一个字节 和 判断32位整数二进制中1的个数 的算法
- (转贴)反转一个字节 和 判断32位整数二进制中1的个数 的算法
- 反转一个字节 和 判断32位整数二进制中1的个数 的算法(ZZ)
- 反转一个字节 和 判断32位整数二进制中1的个数 的算法(ZZ)
- 反转一个字节 和 判断32位整数二进制中1的个数 的算法
- 反转一个字节 和 判断32位整数二进制中1的个数 的算法
- 反转一个字节和判断32位整数二进制中1的个数等算法
- 一个整数转化为二进制数后包含1的个数
- 20.Climbing Stairs
- UIView的常见属性及方法
- hdu 1503 Advanced Fruits 公共子序列
- C#属性
- 软件架构设计之常用架构模式介绍
- 判断一个整数转换成二进制后1的个数
- auto_ptr智能指针
- 简单二叉树的创建,连接树结点,二叉树的深度(转载)
- java--通过DOM4J方式生成rss文件简单实例
- Redis、memcache
- js 数组
- tinyos 串口通信
- 图像处理(二十三)基于调色板的图像Recoloring-Siggraph 2015
- Clos Network 与 Leaf Spine 架构