最近在看
Matrix67大牛的位運算4則(還只看到第3則),看到這,大牛推薦的。
然后就做了下,不過建議先自己理解,別看大牛給的程序,
這個題是二維的格雷碼,把兩個合并起來。
題意是把0到2^(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(其實先把所有列合并起來,然后再在后面加上n的gray就成了這個了)
這樣的話,實現起來就比較容易了
代碼如下(第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");
}