二进制中1的个数问题

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

#include <stdio.h>
#include <iostream>
using namespace std;

#if 0
为了避免死循环 我们左移1也就是二进制的0001 先和n进行&运算
就能判断n的从右数第一位是不是1 依次判断所有 循环次数为整数
二进制的位数 32位整数需要循环32次
#endif

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

#if 0

改进方法:有几个1就循环几次 

把一个整数减去1 再和原整数做&运算 会把该整数最右边一个1变成0 
那么一个整数的二进制表示中有多少个1就可以进行多少次这样的操作

#endif

int func1(int n)
{
	int count = 0;
	while (n)
	{
		n = (n - 1)&n;
		++count;
	}
	return count;
}


int main(int argc,char *argv[])
{
	cout << func(1) << endl;
	cout << func(15) << endl;
	cout << func(3) << endl;
	cout << func(9) << endl;
	cout << "------------" << endl;
	cout << func1(1) << endl;
	cout << func1(15) << endl;
	cout << func1(3) << endl;
	cout << func1(9) << endl;
	return 0;
}

例2:用一条语句判断一个整数是不是2的整数次方,一个整数如果是二的整数次方,那么它的二进制表示中有且只有一位是1,而其他所有位都是0

思路:把这个整数减去1之后再和它自己做&运算,这个整数中唯一的1就会变成0

#include <stdio.h>
#include <iostream>
using namespace std;

bool func(int i)
{
	if (i <= 0) //2的整数次方不能为<=0的数
		return false;
	if (((i - 1)&i) == 0)
		return true;
	return false;
}


int main(int argc,char *argv[])
{
	for (int i = -10; i < 20; i++)
	{
		if (func(i))
			cout << i << "是2的整数次方" << endl;		
	}
	return 0;
}

例3:输入俩个整数m和n,计算要改变m的二进制表示中的多少位才能得到n 比如10的二进制表示为1010,13的二进制表示为1101,需要改变1010中的3位才能得到1101。

思路: 1.求这俩个数的异或^ 2.统计异或结果中1的位数

#include <stdio.h>
#include <iostream>
using namespace std;

int func(int a, int b)
{
	int i = a^b; //相同为0 不同为1
	int p = 1;
	int count = 0;
	while (i)
	{
		i = (i - 1)&i;
		++count;
	}
	return count;
}


int main(int argc,char *argv[])
{
	cout << func(10, 13) << endl;
	cout << func(1, 15) << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/SwordArcher/article/details/79893250