⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 revbinpermute.h

📁 the FXT library: fast transforms and low level algorithms. The package contains many algorithms for
💻 H
字号:
// tuning parameter:#define  REVBIN_PERMUTE_UNROLL   1  // 0 or 1 (unroll, default)#define  REVBIN_PERMUTE0_UNROLL  1  // 0 or 1 (unroll, default)#if  ( REVBIN_PERMUTE_UNROLL==1 )//#warning 'FYI: REVBIN_PERMUTE_UNROLL activated'#else//#warning 'FYI: no REVBIN_PERMUTE_UNROLL'#endif#if  ( REVBIN_PERMUTE0_UNROLL==1 )//#warning 'FYI: REVBIN_PERMUTE0_UNROLL activated'#else//#warning 'FYI: no REVBIN_PERMUTE0_UNROLL'#endiftemplate <typename Type>void revbin_permute(Type *f, ulong n)// put data in revbin order// self-inverse{    if ( n<=2 )  return;    const ulong nh = (n>>1);    Type * const f1 = f + n - 1;    swap(f[1], f[nh]);    ulong k=2, r=nh;#if  ( REVBIN_PERMUTE_UNROLL==1 )    while ( 1  )#else    while ( k<nh  )#endif    {        // k even:        r ^= nh;        for (ulong m=(nh>>1); !((r^=m)&m); m>>=1)  {;}        if ( r>k )        {            swap(f[k], f[r]);     // k<nh, r<nh            swap(f1[-k], f1[-r]); // n-k>nh, n-r>nh        }        ++k;        // k odd:        r += nh;        swap(f[k], f[r]);  // k<nh, r>nh        ++k;#if  ( REVBIN_PERMUTE_UNROLL==1 )        if ( k>=nh )  break;  // break always happens here        // k even:        r ^= nh;        r ^= (nh>>1);        for (ulong m=(nh>>2); !((r^=m)&m); m>>=1)  {;}        if ( r>k )        {            swap(f[k], f[r]);     // k<nh, r<nh            swap(f1[-k], f1[-r]); // n-k>nh, n-r>nh        }        ++k;        // k odd:        r += nh;        swap(f[k], f[r]);  // k<nh, r>nh        ++k;#endif // REVBIN_PERMUTE_UNROLL    }}//============== end =================template <typename Type>void revbin_permute0(Type *f, ulong n)// put data in revbin order// version for zero padded data{    if ( n<=2 )  return;    const ulong nh = (n>>1);    ulong k=2, r=nh;    f[nh] = f[1];    f[1] = 0;#if  ( REVBIN_PERMUTE0_UNROLL==1 )    while ( 1  )#else    while ( k<nh  )#endif//    for (ulong k=1,r=0; k<nh;  )    {        // k even:        r ^= nh;        for (ulong m=(nh>>1); !((r^=m)&m); m>>=1)  {;}        if ( r>k )        {            swap(f[k], f[r]);            // f[-k]==0, f[-r]==0        }        ++k;        // k odd: f[k]!=0, f[r]==0        r += nh;        f[r] = f[k];        f[k] = 0;        ++k;#if  ( REVBIN_PERMUTE0_UNROLL==1 )        if ( k>=nh )  break;  // break always happens here        // k even:        r ^= nh;        r ^= (nh>>1);        for (ulong m=(nh>>2); !((r^=m)&m); m>>=1)  {;}        if ( r>k )        {            swap(f[k], f[r]);            // f[-k]==0, f[-r]==0        }        ++k;        // k odd: f[k]!=0, f[r]==0        r += nh;        f[r] = f[k];        f[k] = 0;        ++k;#endif // REVBIN_PERMUTE0_UNROLL    }}//============== end =================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -