Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C LFSR未按预期工作_C_Bit Shift_Bits - Fatal编程技术网

C 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)

如上所述,我创建了一个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)
    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)|(bit
int
不保证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抽头多边形。