2011-11-13 44 views

回答

8

假設MAX是在編譯時已知的常數,則此代碼:

typedef int map_t [1<<MAX]; 
map_t x; 

是相同的,因爲這代碼:

int x[1 << MAX]; 
+0

x [1 << MAX]究竟是什麼? – Dimme

+1

...這不是一個位掩碼,而是一個「pow(2,MAX)」整數數組。 – delnan

+2

@Dimme'<<'是「左移」運算符。它將第一個操作數中的所有位移到左邊,其位數等於第二個操作數。 'a << b'大致等於'a * pow(2,b)'。 –

6

假設MAX被定義爲8:

typedef int map_t[1<<MAX]; 

相同
typedef int map_t[256]; 

1 << 8因爲= 256這意味着移位位中的數字1 8次向左像這樣:

1是0000 0001在二進制

後1個移:

0000 0010 ,這是十進制

2後8點位移:

1 0000 0000,它是256十進制

所以沒有bitmasking在這裏,它只是簡單的方式說

typedef int map_t[pow(2,MAX)]; 

我沒有做過ç很多,但上面的應該編譯吧?

編輯:以上不編譯,但如果我們要動態分配它應該工作。

+0

根據許多事情,在數組索引中使用函數'pow'可能無法編譯。但是一個很好的解釋。 – aschepler

+1

不,它不編譯,因爲數組綁定必須是整數常量。 (pow()的返回類型也是雙重的,但更重要的是它不是常量:'typedef int map_t [(int)pow(2,MAX)]'將不起作用) –

+0

嗯......這樣的工作? 'double tmp = pow(2,MAX); typedef int map_t [(int)tmp];'對不起,我根本不瞭解很多C:P但是很多語言的原理都是一樣的 – Esailija