下面的代码输入为原数饥薯据和多项式对就的二进制码,输出为产生的校验码。
如原数据是1101011011,多项式是X^4+X+1(即10011)。产生的校验码为1110。
输入1101011011 10011
输出1110
#include <iostream>#include <cstring>
#include <iomanip>
using namespace std
#define WORDSIZE 255
int getNum(char a[], int n)
void showNum(int r, int n)
int main(int argc, char *argv[])
{
cout<<"please input X and P:"<<endl
int x, p, lenA, lenP
char a[WORDSIZE]
memset(a, '烂野者\0', WORDSIZE)
cin>>a
lenA = strlen(a)
x = getNum(a, WORDSIZE)
memset(a, '\0', WORDSIZE)
cin>>a
lenP = strlen(a)
p = getNum(a, WORDSIZE)
x <<= lenP - 1
int result = 0, i
for (i = lenA - 1 i >= 0 i--) {
if (x & (1 << (i + lenP - 1))) {
result = result * 2 + 1
x ^= (p << i)
} else {
result = result * 2
}
}
showNum(x, lenP - 1)
return 0
}
int getNum(char a[], int n)
{
int k = 0
int i
for (i = 0 i < n && a[i] != '\0' i++) {
k = k * 2 + a[i] - '0'
}
脊让return k
}
void showNum(int r, int n)
{
int i
for (i = n - 1 i >= 0 i--) {
if (r & (1 << i)) {
cout<<1
} else {
cout<<0
}
}
cout<<endl
}
这是以前自己偷懒做计算机网络CRC题目时写的程序,希望对你有用。
我来答1.假定16个数放在20H为首的地址里,送到目的50H为首橘乎厅的地址里
LOOP:
MOV R0,#20H
MOV R1,#50H
MOV A,@R0
MOV @R1,A
INC R0
INC R1
CJNE R0,#30H,LOOP当inc r0 前,R0=2FH,加1后R0+1=30H,不跳转
2.假定16个数放在内部RAM20H为首的地址里,送到外部RAM目的0010H为首的地址里
MOV R0,#20H
MOV DPTR,#0010H
MOV A,@R0
MOVX @DPTR,A
INC R0
INC DPTR
CJNE R0,#30H,LOOP当R0=2FH时,R0+1=30H,不跳转
3.将外部RAM以1000H为首的16个数据放入,外部RAM以2000h为首的地址内
MOV R7,#0FH
MOV DPTR,#1000H将源地址放入第一个DPTR
INC AUXR1转换指针,指向第二个DPTR
MOV DPTR,#2000H;将目的地址放入第二个DPTR
INC AUXR1指向源dptr
LOOP:
MOV A,@DPTR将源地址数据放入A
INC DPTR源地址加1
INC AUXR1转顷碧换为目的地址
MOV @DPTR,A将A内容放入目的地址
INC DPTR目的地址加1
INC AURX1指向源地址
DJNZ R7,LOOPR7减1,圆隐循环,减15次
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)