最近在看Matrix67大牛的位运算4则(还只看到第3则),看到这,大牛推荐的。
然后就做了下,不过建议先自己理解,别看大牛给的程序,
 这个题是二维的格雷码,把两个合并起来。
题意是02^(n +m)-1的数写成2^n * 2^m的矩阵,使得位置相邻两数的二进制表示只有一位之差
这样的话就是把n位的格雷码和m位的格雷码合并起来就行了
n = 1 m = 2来说吧
可以自己先穷举一下会发现时下面的样子
 
000(0)
100(4)
110(6)
010(2)
001(1)
101(5)
111(7)
011(3)
可以发现各列的前两位是一样的,也是m位的gray(其实先把所有列合并起来,然后再在后面加上ngray就成了这个了)
这样的话,实现起来就比较容易了
代码如下(第n个gray码是n ^ (n >> 1)(其中n从0开始))





for(x = 0;x < 1<<n;x++)
    {
//列的gray  就可以把一行搞成几行
       u = (x ^ (x >> 1));//计算n位的gray
    for(y = 0;y < 1<<m;y++)
       {
//计算m位的gray
             t = (y ^ (y >> 1)) << n;//移位,这里就是左移一位
             printf("%d ",(u | t));//输出,由于这里的不会出现进位,所以可以用加
        }
       printf(
"\n");
    }