题目要求如下:
有一个 16 位的整数,每 4 位为一个数,写函数求他们的和。例:
整数: int a=1101010110110111;
和: int sum=1101+0101+1011+0111;
用十进制做参数,计算时按二进制考虑。
答案为36
思路:把字符串存入char数组,数组会产生下标。输入对应的下标完成分割,例如我想分割从0到3的部分,之后用for循环扫描这一部分,该部分的数会进入二进制计算器进行计算。
二进制计算器:没有采用“逢2进1”的进位思想,而是采用了幂的思想。例如1101,最右边的一位,需要乘以2的0次方;最左边的一位,需要乘以2的3次方。为简化代码,直接使用数组存储相应的数值[1,2,4,8],遇到右边第一位直接读取1,乘以1;遇到第二位直接读取2,乘以2即可。
代码如下:
#include<iostream>
using namespace std;
int SumFuction(char s[],int end,int start) {//进制转化函数,注意是从右往左读
//输入字符串char s[],开始的位置start,结束位置end,
//函数执行功能:字符串从start到end的字符将转化为相应的十进制数并输出
//例:输入字符串1101 输出十进制数13
int power[] = { 1,2,4,8 };//二进制右上角的幂
int countpower = 0;//位数
int s1 = 0;//s1为字符串s的1-4位的和
for (int i = start; i >= end; i--, countpower++) {//从左往右第二位开始,使用幂运算 8 4 2 0
s1 = s1 + (s[i] - 48) * power[countpower];//s[i]以ASCII码参与运算,0存储为48,要减去相应数值
}
return s1;
}
int main() {
char s[] = "1101010110110111";
int s1=SumFuction(s,0,3);//截取字符串0-3位的数,计算其值
int s2 = SumFuction(s, 4, 7);
int s3 = SumFuction(s, 8, 11);
int s4 = SumFuction(s, 12,15);
cout << "十六位数分割后求和为" << s1 + s2 + s3 + s4 << endl;
return 0;
}
运行截图如下: