c - 这段代码是关于什么的?

标签 c byte-shifting

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

最佳答案

这是一个 linear feedback shift register 。 (或者根据描述,这就是它应该的样子。)

这样的函数是根据二元多项式定义的,并生成一个固定的、确定性的正整数排列,最多为给定的 2 次幂。因此,它是可称为“随机”的最不随机的事物之一。

关于c - 这段代码是关于什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14679898/

相关文章:

c - 什么时候可以将整数传递给需要无符号的函数,反之亦然

c - 在 C 中,我无法将字符串数组的单个元素复制到另一个字符串

Java 移位字节返回意外结果

c system() 函数导致段错误

c - 如何将表存储到空表中

c - 在 Ida pro 中反汇编 c 函数

java - 从 Java 中的 HEX 字符串创建 ISO-8859-1 字符串,移位位

c# - 整数转换中的字节移位问题

c - 在 C 中移动数组的最佳方法?

java - 使用移位操作将 Java 中的代码点转换为 utf-8 字节数组