算法原理
抽头
根据设定的多项式进行抽头,然后将抽头的数据异或,放到 移动后的数据最高位。(注意,此最高位表示最靠近 移动方向的第一位数据)
移出的数据必须参与反馈
根据抽头多项式,把移动前的最高位,作为反馈 ,放到移动后的数据 最低位。(注意,此最低位表示移出的那个新的位)
源码实现和运行结果
unsigned short buf[10]={0};
unsigned char LFSR = 0X3a;
unsigned char a;
unsigned char data = 0, d5 = 0, d6 = 0,d7 = 0;
//==========================
// 多项式中的 最高位位置是以你移动的方向来定的,
//向左移 X^7就表示数据的D7
//向右移 X^7就表述数据的D1
//==========================
void LFSR_Calc_7bit_Res_127_Left_move(int i)
{
d7 = d6 = 0;
data = LFSR & 0x7f; // 7位,抽头[7,6],x^7+x^6+1
if(data == 0) data = 1; // 不能为0, 不然会进入死循环
if(data & 0x40) d7 = 1; // 取D7
if(data & 0x20) d6 = 1; // 取D6
data <<= 1;
data &= 0x7f;
if(d7) // D1 = D7 最后一位必须参与反馈
data |= 0x01;
else
data &= (~0x01);
if(d7 ^ d6) // D7 = D7^D6
data |= 0x40;
else
data &= (~0x40);
LFSR = data;
if(i==0)
{
a = LFSR;
}
printf("%x,",LFSR);
}
unsigned char d2 = 0,d1 = 0;
void LFSR_Calc_7bit_Res_127_right_move(int i)
{
d1 = d2 = 0;
data = LFSR & 0x7f; // 7位,抽头[7,6],x^7+x^6+1
if(data == 0) data = 1; // 不能为0, 不然会进入死循环
if(data & 0x01) d1 = 1; // 取D1
if(data & 0x02) d2 = 1; // 取D2
data >>= 1;
data &= 0x7f;
if(d1) // D7 = D1 最后一位必须参与反馈
data |= 0x40;
else
data &= (~0x40);
if(d1 ^ d2) // D1 = D1^D2
data |= 0x01;
else
data &= (~0x01);
LFSR = data;
if(i==0)
{
a = LFSR;
}
printf("%x,",LFSR);
}
int main()
{
for(int i=0;i<500;i++)
{
//LFSR_Calc_7bit_Res_127_right_move(i);
LFSR_Calc_7bit_Res_127_Left_move(i);
if(a == LFSR && i!=0)
{
printf("\n Same is :%d\n",i);
break;
}
}
}
左移运行结果如下:
74,29,52,65,b,16,2c,58,71,23,46,4d,5b,77,2f,5e,7d,3b,76,2d,5a,75,2b,56,6d,1b,36,6c,19,32,64,9,12,24,48,51,63,7,e,1c,38,70,21,42,45,4b,57,6f,1f,3e,7c,39,72,25,4a,55,6b,17,2e,5c,79,33,66,d,1a,34,68,11,22,44,49,53,67,f,1e,3c,78,31,62,5,a,14,28,50,61,3,6,c,18,30,60,1,2,4,8,10,20,40,41,43,47,4f,5f,7f,3f,7e,3d,7a,35,6a,15,2a,54,69,13,26,4c,59,73,27,4e,5d,7b,37,6e,1d,3a,74,
Same is :127
有127次结果。
/
右移结果如下:
1d,4f,66,33,58,2c,16,b,44,22,11,49,65,73,78,3c,1e,f,46,23,50,28,14,a,5,43,60,30,18,c,6,3,40,20,10,8,4,2,1,41,61,71,79,7d,7f,7e,3f,5e,2f,56,2b,54,2a,15,4b,64,32,19,4d,67,72,39,5d,6f,76,3b,5c,2e,17,4a,25,53,68,34,1a,d,47,62,31,59,6d,77,7a,3d,5f,6e,37,5a,2d,57,6a,35,5b,6c,36,1b,4c,26,13,48,24,12,9,45,63,70,38,1c,e,7,42,21,51,69,75,7b,7c,3e,1f,4e,27,52,29,55,6b,74,3a,1d,
Same is :127
有127次结果。
///