剑指Offer之 - 二进制中1的个数

题目:

求一个数的二进制表示形式中的1的个数。

思路:

1、用1,从n的后面往前依次与n相与即可

2、把一个数-1的结果就是把它的二进制形式的最后一个1去掉,而后面的全变成1,如1111 1100 - 1 = 1111 1011
然后二者相与,得到的结果相比于原来的数就减少1个1,直到结果为0。即 1111 1100 & 1111 1011 = 1111 1000 。

代码:

#include <iostream>
using namespace std;

//五种位运算:& | ^ << >>
//左移运算<< :右边补0
//右移运算>> :如果是正数,左边补0 ,如果是负数,左边补1
//0000 1010 >> 2 : 0000 0010
//1000 1010 >> 3 : 1111 0001

//功能:求出一个整数的二进制形式的1的个数

//解法1:用1,从n的后面往前依次与n相与即可

int NumberOf1(int n)
{
	if(n == 0)
		return 0;
	int num = 0;
	int flag = 1;
	while(flag)
	{
		if( n & flag)
			num++;
		flag = flag << 1;//flag移位
	}
	return num;
}

//解法2:把一个数-1的结果就是把它的二进制形式的最后一个1去掉,而后面的全变成1,如1111 1100 - 1 = 1111 1011
//1111 1100 & 1111 1011 = 1111 1000 

int NumberOf1HHT(int n)
{
	int num = 0;
	while(n)
	{
		++num;
		n = (n - 1) & n;
	}
	return num;
}

//应用1:判断一个数是不是2的整数次方 , 比如0000 1000 ,可先-1,再与,结果如果为0,则是2的整数次方
//应用2:输入两个整数m和n,判断需要改变m的二进制表示中的多少位才能得到n。方法:先异或m ^ n,在求结果的1的个数
//如1010 1101 , 异或后0111,结果为3



int main()
{
	int n ;
	while(cin>>n)
	{
		cout<<NumberOf1(n)<<endl;
		cout<<NumberOf1HHT(n)<<endl;
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值