编程思路
借助vector进行运算,vector中每一个元素一次代表被除数的一位数,随运算过程,下标改变,直至全部计算完。所谓的“除”,是借助二进制数的异或运算实现的。最后实现的用户效果是,任意输入待发送数据和除数,即可得到相应冗余码。
实验过程(具体代码)
#include <iostream>
#include<vector>
#include<string>
using namespace std;
//循环冗余检验(CRC)
void main()
{
vector<int> number; //用于存储被除数,vector中每一个元素一次代表一位数
string s,p,q,r; //s为待传输的数据,p为除数,q为每一轮与p进行异或运算的数,r为余数(即冗余码)
cout <<"请输入待发送的数据:";
cin >> s;
int i,sign,z,x;
for ( i = 0; i < s.length(); i++) //先存入待传输的数
{
number.push_back(s[i]-'0');
}
cout << "请输入除数:";
cin >> p;
q = p;
r = p;
for (i = 1; i < p.length(); i++) //再根据除数位数在后面添0得到被除数
{
number.push_back(0);
}
for (i = 0; i < p.length(); i++)
{
q[i] = char(number[i]+'0');
}
sign = p.length(); //sign为记录被除数操作到哪一位的标志数
while (sign < number.size()+1)
{
for (i = 0; i < p.length(); i++) //异或运算
{
r[i] = char(((p[i]-'0')^(q[i]-'0'))+'0');
}
z = 0;
for (i = 0; i < r.length(); i++)
{
if (r[i] == '0')
z++;
else
break;
}
if (sign == number.size())
break;
x = number.size() - sign;
if (x < z)
{
for (i = 0; i < r.length()-z; i++)
{
r[z - x + i] = r[z + i];
}
for (i = 0; i < x; i++)
{
r[r.length()-x+i] = char(number[sign++]+'0');
}
break;
}
for (i = 0; i < r.length() - z; i++)
{
q[i] = r[z+i];
}
for (i = 0; i < z; i++)
{
q[r.length()-z+i] = char(number[sign++] + '0');
}
}
cout << "冗余码为:";
for (i = 1; i < r.length(); i++)
{
cout << r[i];
}
cout << endl;
system("pause");
}
测试结果
测试结果正确。
PS:我写的应该不算简洁,有同学三十多行就搞定了qaq