1 unsigned long cantor(unsigned long S)
 2 {
 3     long x=0,i,p,k,j;
 4     bool hash[8]={false};
 5     for (i=8;i>=2;i--)
 6     {
 7         k=S>> 3*(i-1);
 8         S-=k<<3*(i-1);
 9         hash[k]=true;
10         p=k;
11         for (j=0;j<=k-1;j++)
12             if (hash[j])
13                 p--;
14         x+=fac[i-1]*p; //fac存的是阶乘 fac[1] = 1, fac[2] = 2, fac[3] = 6
15     }
16     return x;
17 }

其实就是求全排列中,某一个排列的序号

比如321,对应1,2,3的全排列的第6号

上面这个是8禁止存储的,有利于位操作