15(二进制中1的个数)、16(数值的整数次方)

题目15分析:(二进制中1的个数)
使用位移运算符可直接获得整数的二进制形式,利用位与来判断1的个数,如果右移位需要判断数的正负,左移就
不需要,所以从右往左开始,逐位判断是否位为1;也可将二进制中的1的位逐个删除,直到整数为0;
位与思路:
1.设标志位=1
2.与整数位与,若最低位是1,则加1,若不是则标志位左移1位,直至标志位左移到数据类型位数,则退出
删除1思路:

1.整数-1,再和原整数位与,则删除二进制最右边的1,直到整数为0

#include <iostream>

using namespace std;

int binary_count_1(int n)
{
	int count = 0;
	unsigned int flag = 1;
	while (flag)
	{
		if (n&flag)
			++count;
		flag = flag << 1;
	}
	return count;
}
int binary_count_1(int n,char ch)
{
	int count = 0;
	while (n)
	{
		++count;
		n = (n - 1)&n;
	}
	return count;
}
void main()
{
	int num = 9;
	cout << "第一种解法:" << binary_count_1(num) << endl;
	cout << "第二种解法:" << binary_count_1(num, '2') << endl;
}

题目16分析:(数值的整数次方)
为了高效运算,可先求整数的平方,再求4次方...,可利用递归的思想
思路:
1.初始化指数为0、1的返回值
2.递归,指数右移一位(也就是除2,提高运算效率),直到结果指数为1返回结果
3.当n为偶数,result = 返回result * 返回result

4.当n为奇数,result = 返回result * 返回result * base

#include <iostream>

using namespace std;

double pow(double base, unsigned int exp)
{
	//1.初始化指数为0、1的返回值
	if (exp == 0)
		return 1;
	if (exp == 1)
		return base;

	//2.递归,指数右移一位(也就是除2,提高运算效率),直到结果指数为1返回结果
	double result = pow(base, exp >> 1);

	//3.当n为偶数,result = 返回result * 返回result
	result *= result;

	//4.当n为奇数,result = 返回result * 返回result * base
	if (exp && 0x1 == 1)//仅在所有递归出来之后运行此判断
		result *= base;
	return result;
}
void main()
{
	double base = 1.5;
	unsigned int exp = 2;
	cout << "指数运算结果:" << pow(base, exp) << endl;
}

猜你喜欢

转载自blog.csdn.net/attitude_yu/article/details/80574045