我是靠谱客的博主 故意跳跳糖,最近开发中收集的这篇文章主要介绍判断一个整数转换成二进制后1的个数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

判断一个整数转换成二进制后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》


最后

以上就是故意跳跳糖为你收集整理的判断一个整数转换成二进制后1的个数的全部内容,希望文章能够帮你解决判断一个整数转换成二进制后1的个数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部