C LFSR未按预期工作
如上所述,我创建了一个LFSR来尝试生成一些数字,但是它不能正常工作 从这个开始:C LFSR未按预期工作,c,bit-shift,bits,C,Bit Shift,Bits,如上所述,我创建了一个LFSR来尝试生成一些数字,但是它不能正常工作 从这个开始: unsigned int lfsr = 0x000001 while(1) { lfsr >>= 1 unsigned int lsb1 = lfsr & 1; unsigned int lsb2 = lfsr & 2; if (lsb1 == 1 && lsb2 == 1 || lsb1 == 0 && lsb2 == 0)
unsigned int lfsr = 0x000001
while(1)
{
lfsr >>= 1
unsigned int lsb1 = lfsr & 1;
unsigned int lsb2 = lfsr & 2;
if (lsb1 == 1 && lsb2 == 1 || lsb1 == 0 && lsb2 == 0)
lfsr |= 0x000000;
else
lfsr |= 0x800000;
}
但是,这不起作用,lsb2等于2,所以经过一些讨论,我现在得到了这个:
unsigned int lfsr = 0x000001
while(1)
{
lfsr >>= 1
lfsr |= ( (((unsigned int)((lfsr<<31)>>31)) ^ ((unsigned int)((lfsr<<30)>>31))) << 24);
}
无符号整数lfsr=0x000001
而(1)
{
lfsr>>=1
lfsr |=(((unsigned int)((lfsr31))^((unsigned int)((lfsr31)))不正确的代码:lsb2==1
从来都不是真的
unsigned int lsb2 = lfsr & 2;
...
if (lsb1 == 1 && lsb2 == 1 .... // bad
可能应该是
if (lsb1 && lsb2 .... // better
同意,考虑<代码> UTIT32→T < /代码> .< /P> < P>这些循环将通过(2 ^ 24)- 1个数(所有2个24个数,但为零)。第一个例子是伽罗瓦LFSR,XOR用(反馈多项式)然后移位。第二个例子是伽罗瓦LFSR,然后用(反馈多项式>1)移位XOR的GOLIS LFSR。。第三个示例是Fibonacci LFSR。请注意,当开始_状态为0x000001时,所有三个示例的位值遵循相同的模式,即使Galois LFSR和Fibonacci LFSR将遵循不同的模式。0x100001b是最小的反馈多项式,0x1c20001是(2^24)-1周期的最大4抽头反馈多项式
unsigned int lfsr = 0x000001 // actually int is 4 bytes so result is 0x00000001
while(1)
{
lfsr >>= 1 // now lfsr = 0
unsigned int lsb1 = lfsr & 1; // == 0
unsigned int lsb2 = lfsr & 2; // == 0
// the following line will 'work' however, it is always better/clearer
// to force the correct precedence via parens
// and lsb2 will be 0 or 2, never 1
if (lsb1 == 1 && lsb2 == 1 || lsb1 == 0 && lsb2 == 0)
lfsr |= 0x000000; // this will always be executed and makes no change to the value in 'lfsr'
else
lfsr |= 0x800000; // unsigned int is 4 bytes, so this is actually 0x00800000
}
此示例遵循wiki Galios LFSR示例,先执行xor:
int main(int argc, char *argv[])
{
unsigned int period, bit, lfsr, start_state;
period = 0;
lfsr = start_state = 0x000001;
do
{
bit = lfsr&1; /* get bit */
lfsr ^= (0-bit)&0x100001b; /* toggle taps if bit was 1 */
lfsr >>= 1; /* shift lfsr */
++period;
}while(lfsr != start_state);
printf("%x\n", period); /* period will == 0xffffff */
return(0);
}
int main(int argc, char *argv[])
{
unsigned int period, bit, lfsr, start_state;
period = 0;
lfsr = start_state = 0x000001;
do
{
bit = lfsr & 1; /* get bit */
lfsr >>= 1; /* shift lfsr */
lfsr ^= (0-bit)&0x80000d; /* toggle taps if bit was 1 */
++period;
} while (lfsr != start_state);
printf("%x\n", period); /* period will == 0xffffff */
return(0);
}
此示例遵循wiki Galios LFSR示例,首先完成移位:
int main(int argc, char *argv[])
{
unsigned int period, bit, lfsr, start_state;
period = 0;
lfsr = start_state = 0x000001;
do
{
bit = lfsr&1; /* get bit */
lfsr ^= (0-bit)&0x100001b; /* toggle taps if bit was 1 */
lfsr >>= 1; /* shift lfsr */
++period;
}while(lfsr != start_state);
printf("%x\n", period); /* period will == 0xffffff */
return(0);
}
int main(int argc, char *argv[])
{
unsigned int period, bit, lfsr, start_state;
period = 0;
lfsr = start_state = 0x000001;
do
{
bit = lfsr & 1; /* get bit */
lfsr >>= 1; /* shift lfsr */
lfsr ^= (0-bit)&0x80000d; /* toggle taps if bit was 1 */
++period;
} while (lfsr != start_state);
printf("%x\n", period); /* period will == 0xffffff */
return(0);
}
此示例遵循wiki Fibonacci LFSR示例:
int main(int argc, char *argv[])
{
unsigned int period, bit, lfsr, start_state;
period = 0;
lfsr = start_state = 0x000001;
do
{
/* taps: 24 4 3 1 */
/* feedback polynomial: x^24 + x^4 + x^3 + x + 1 = 0x100001b */
bit = ((lfsr>>(24-24))^(lfsr>>(24-4))^(lfsr>>(24-3))^(lfsr>>(24-1)))&1;
lfsr = (lfsr >> 1) | (bit << 23);
++period;
} while (lfsr != start_state);
printf("%x\n", period); /* period will == 0xffffff */
return(0);
}
intmain(intargc,char*argv[])
{
无符号整型周期、位、lfsr、开始状态;
周期=0;
lfsr=start\U state=0x000001;
做
{
/*水龙头:24431*/
/*反馈多项式:x^24+x^4+x^3+x+1=0x100001b*/
位=((lfsr>>(24-24))^(lfsr>>(24-4))^(lfsr>>(24-3))^(lfsr>>(24-1))&1;
lfsr=(lfsr>>1)|(bitint
不保证32位。请改用stdint.h
类型!你想用lfsr |=0x000000;
实现什么?我猜lfsr的意思。维基百科上的文章描述的周期比2的幂小1。你为什么期望周期为2^24?(请贴一个链接解释这个理论)@fuzzxl:我强烈怀疑无符号长
“去2**32
”!但我想你的意思是2**32-1
。然而,关键是,1)OP不使用无符号长
,2)a长
很可能有64位(例如在POSIX-64位体系结构上)。3)掩码(、文本和注释)暗示OP需要32位。您的uint32_t
有什么问题?它们正是为这样的应用程序而存在的。如果您的实现没有提供stdint.h
,因此甚至不符合C99,请向您的供应商投诉或购买一个现代编译器-C99现在已经超过16年了!…甚至尝试……”我真的印象深刻。刚刚过了16年,C11已经4岁了。对于XP来说:是的,任何仍然使用XP的人都是注定要失败的。(然而:是不是OP写的他正在使用XP?)你只是在猜测,这不会有任何结果。我不再胡说八道。所以我需要将结果右移一位?我实际上不需要32位,只需要24位,但我认为使用32位不会有什么害处,因为24位左边的所有位都是0,不会影响生成的数字。@GeorgeStorm 1)是的,替代方法可以是无符号整数lsb2=(lfsr&2)>>1;
或=!!(lfsr&2);
或其他。2)关于32位与24位:无符号
至少只有16位。因此,建议使用一个整数保证满足您的32/24位宽度需求。谢谢,这似乎确实有效,我们将进一步阅读以了解原因,因为它似乎与@anatolyg在对我的问题的评论中链接的pdf不相关。@GeorgeStorm-我更新了我的答案,前两个示例使用a。第一个示例在移位前执行xor,以显示25位反馈多项式(0x100001b)。第二个示例遵循wiki示例代码。第三个示例使用具有相同反馈多项式的Fibonacci LFSR,类似于示例代码所做的。0x100001b是最小的多边形,0x1c20001是(2^24)-1周期的最大4抽头多边形。