C 这个代码是关于什么的?

C 这个代码是关于什么的?,c,byte-shifting,C,Byte Shifting,好的。。我知道问这样的问题听起来很烦人,但我真的不理解下面的代码[advance_reg(int*)]。在代码的注释中,它说“/寄存器根据原始多项式(64,4,3,1,0);/”步进,我只是不明白。有人请给我一个关于这个代码的提示吗?例如,为什么它这样定义adv_64数组?我知道第一个块将数字移动了27次,每次一位。但是为什么呢?这背后的数学原理是什么?此外,为什么要执行第二个for块?这些都与多项式(64,4,3,1,0)有什么联系 static int-bitcnt(int-x) { 无符号

好的。。我知道问这样的问题听起来很烦人,但我真的不理解下面的代码[advance_reg(int*)]。在代码的注释中,它说“/寄存器根据原始多项式(64,4,3,1,0);/”步进,我只是不明白。有人请给我一个关于这个代码的提示吗?例如,为什么它这样定义adv_64数组?我知道第一个块将数字移动了27次,每次一位。但是为什么呢?这背后的数学原理是什么?此外,为什么要执行第二个for块?这些都与多项式(64,4,3,1,0)有什么联系

static int-bitcnt(int-x)
{
无符号i=0,y;
对于(y=(无符号)x;y;y&=(y-1))
i++;
回报(i);
} 
静态无效提前注册(int*reg\u填充)
{
常数int mask=0x1b;
国际顾问64[4][2];;
int i,新填充[2];
未签字的临时工;
adv_64[0][0]=0xb0000000;
adv_64[0][1]=0x1b;
adv_64[1][0]=0x60000000;
adv_64[1][1]=0x2d;
adv_64[2][0]=0xc0000000;
adv_64[2][1]=0x5a;
adv_64[3][0]=0x8000000;
adv_64[3][1]=0xaf;
新填充[1]=新填充[0]=0;
temp=mask它是一个(或者根据描述,它应该是这样的。)


这样一个函数用二元多项式定义,并生成一个固定的、确定的正整数排列,其最大幂为2。因此,它是可以称为“随机”的最小随机数之一

为什么ppl会对这个问题给我负面评价?我真的很诚恳地问这个问题。为那些傲慢自大的ppl感到羞耻!如果我有更好的解决方案或ppl要求,我就不会在stackoverflow上发布它了!你还没有解释代码的任何内容,它应该做什么,为什么你有问题,或者为什么你需要帮助。你能这是一个伪随机数生成器的种子代码[SPRNG2.0的一部分,我没有得到它。]。我想我已经描述了我为什么会遇到上述问题。stackoverflow真丢脸。我猜ppl今天只是在嘲笑别人的问题,以掩盖他们实际上对此没有任何答案!我自己会想出来的!如果有人试图回答这个问题,你最好准备好具备合格的知识,但只是有能力投票否决ppl的追求ion!我知道被否决票让人很难过。但他们不是在批评你,而是在批评这个问题。评论“这是伪随机数生成器的种子代码[SPRNG2.0的一部分]”真的需要在问题本身中(单击“编辑”框!)。想象一下,对于一个完全不懂C但对你的项目一无所知的陌生人来说,这个问题会是什么样子。是的!衷心感谢!!这是一个LFSR。但是为什么adv_64是这样定义的?它与多项式(64,4,3,1,0)有什么关系?
 static int bitcnt( int x) 
 {
    unsigned i=0,y;

    for (y=(unsigned)x; y; y &= (y-1) ) 
      i++;
    return(i);
 } 

 static void advance_reg(int *reg_fill)
 {
  const int mask = 0x1b;
  int adv_64[4][2];
  int i,new_fill[2];
  unsigned temp;

  adv_64[0][0] = 0xb0000000;
  adv_64[0][1] = 0x1b;
  adv_64[1][0] = 0x60000000;
  adv_64[1][1] = 0x2d;
  adv_64[2][0] = 0xc0000000;
  adv_64[2][1] = 0x5a;
  adv_64[3][0] = 0x80000000;
  adv_64[3][1] = 0xaf;
  new_fill[1] = new_fill[0] = 0;
  temp = mask<<27;

  for (i=27;i>=0;i--) 
  {
     new_fill[0] = (new_fill[0]<<1) | (1&bitcnt(reg_fill[0]&temp));
     new_fill[1] = (new_fill[1]<<1) | (1&bitcnt(reg_fill[1]&temp));
     temp >>= 1;
  }

  for (i=28;i<32;i++) 
  {
     temp = bitcnt(reg_fill[0]&(mask<<i));
     temp ^= bitcnt(reg_fill[1]&(mask>>(32-i)));
     new_fill[0] |= (1&temp)<<i;
     temp = bitcnt(reg_fill[0]&adv_64[i-28][0]);
     temp ^= bitcnt(reg_fill[1]&adv_64[i-28][1]);
     new_fill[1] |= (1&temp)<<i;
   }

  reg_fill[0] = new_fill[0];
  reg_fill[1] = new_fill[1];
  }