/*
LFSR:线性反馈移位寄存器的c语言实现
现在只能直线固定的初始状态的LFSR
接下来的思路是找到最后与反馈值运算的动态数字,由于输入初始状态时手动的
所以不能确定位数,所以需要一个动态的值与反馈值运算
建议测试数据:
初始状态:1001
特征多项式:1001(1);
输出序列:100100011110101100100......
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
unsigned long int x,y;
void main()
{
char a[100],b[100];
printf("请输入本源多项式(采用系数向量法并且去掉最后的一个1):");
scanf("%s",a);
printf("请输入初始状态:");
scanf("%s",b);
for(int i=31;i>=0;i--) //先将本源多项式a变成变成整型x,这样才能移位运算
{
x=x<<1;
if(a[i]=='1')
x+=1;
}
for(int i=31;i>=0;i--) //先将初始状态变成变成整型y,这样才能移位运算
{
y=y<<1;
if(b[i]=='1')
y+=1;
}
int x1 = strlen(b); //初始状态的长度;
char e[100]; //想用数组来保存我的初始状态,但是数组不能动态第一大小,可以考虑malloc函数
int x2 = strlen(a);
int j,l,m,n;
char s[100];
for(j=0;j<30;j++) //因为是4为初始状态,所以最大周期为15,只用输出大于15位即可
{
n = x&y; //将初始状态和本源多项式相与结果保存在n中
m = 0; //m记录那种1的个数,若是奇数个那么反馈值为1,反之为0
for(l=0;l<x2;l++) //m记录1的个数的算法
{
if(n&1 != 0)
m++;
n = n>>1;
}
if(y&1) //输出状态的最后一位
{
s[j]='1';
}
else
s[j]='0';
if(m&1) //决定反馈值的算法
{
y = y>>1;
y = y|0x8; //因为特定的初始状态为4为,所以与反馈值运算的数定为2进制的1000
}
else
{
y = y>>1;
y = y&0x7; //因为特定的初始状态为4为,所以与反馈值运算的数定为2进制的0111
}
}
s[j]='\0'; //给保存结果的数组加结束符
printf("输出序列为:\n");
printf("%s\n",s);
FILE * infile;
infile=fopen("xulie.txt","w");
printf("序列文件创建成功!\n");
fprintf(infile,"%s",s); //写入文件
fclose(infile); //关闭infile文件流
printf("序列文件xulie.txt已保存!\n");
system("pause");
}
评论1