最近在看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");
    }