题目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; }