最近在看Matrix67大牛的位運算4則(還只看到第3則),看到這,大牛推薦的。
然后就做了下,不過建議先自己理解,別看大牛給的程序,
然后就做了下,不過建議先自己理解,別看大牛給的程序,
這個題是二維的格雷碼,把兩個合并起來。
題意是把0到2^(n +m)-1的數(shù)寫成2^n * 2^m的矩陣,使得位置相鄰兩數(shù)的二進制表示只有一位之差
這樣的話就是把n位的格雷碼和m位的格雷碼合并起來就行了
拿n = 1 m = 2來說吧
可以自己先窮舉一下會發(fā)現(xiàn)時下面的樣子
一
|
二
|
三
|
四
|
000(0) |
100(4) |
110(6) |
010(2) |
001(1) |
101(5) |
111(7) |
011(3) |
可以發(fā)現(xiàn)各列的前兩位是一樣的,也是m位的gray(其實先把所有列合并起來,然后再在后面加上n的gray就成了這個了)
這樣的話,實現(xiàn)起來就比較容易了
代碼如下(第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));//輸出,由于這里的不會出現(xiàn)進位,所以可以用加
}
printf("\n");
}
{//列的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));//輸出,由于這里的不會出現(xiàn)進位,所以可以用加
}
printf("\n");
}