2013-01-22 96 views
7

任何人都可以解釋以下語法嗎?Ansi中的位設置C

#define Bitset(var,bitno) ((var) |=1UL<<(bitno)) 

我知道它設置了var的位,但我無法理解語法。

+1

語法由完全不起眼的C運算符組成。沒什麼不尋常的。你想要解釋什麼?如果您不知道基本C語言操作符的含義,那麼您可以在* book *中讀取它。這不是「解釋C語言中的一般表達式語法」問題的地方。如果您在理解某些具體問題時遇到問題,那麼您必須說明它是什麼。 – AnT

+0

這是一個宏。將宏名稱「Bitset」替換爲後面的字符,將宏的位置參數替換爲「var」和「bitno」。剝去不必要的支撐物以更好地理解它。 –

+0

你可能會被很少使用的「1UL」拋出,它只是無符號長整型的文字1。 –

回答

13

讓我們把它分解,一塊一塊:

1ULunsigned long int與在位級所表示的1的值:

00000000000000000000000000000001 

<<是一個「位移位」運算符,它會將上述值中的所有位移動到左側bitno的次數。如果是1UL<<5,你會擁有:

00000000000000000000000000100000 

一旦你有了這個值,|=(這是一個bitwise OR operation與分配)將基本上強制var位這是符合這一1是一個1和不會觸摸的任何其它位,因爲(X | 0 = X

比方說var37bitno7。然後,一切都在位水平將是這樣的:

00000000000000000000000000100101 // var 
00000000000000000000000010000000 // 1UL<<7 

00000000000000000000000010100101 // var | (1UL<<7) 

最後,如果是不明確的,#define馬克Bitset作爲function-like macro

2

這是一個宏。每當預處理命中如下語句Bitset(var,bitno)它忠實地

var = var | 1UL << (bitno) 

進一步取代它來解釋這一點。

UL這裏的意思是無符號長整數

運算符|用於bitwise OR運算。所以可變varOR ED與 1UL << bitno和期間運行時編譯時取決於程序的性質分配回var

然後,

var01000110bitno5

然後1UL << 5 = 3200100000

然後

var = 01000110 | 00100000 

var = 01100110

+3

重寫代碼如何回答問題? – nico

+0

@nico我只是在和別人競爭。 –

+0

不知道這是一場比賽 – nico

0

說VAR = 8,也就是說在二進制0000 1000

如果你

8 | 16,你將有0000 1000 | 0001 0000,這將給你0001 1000,因爲|操作設置位,如果任一位爲1

所以你申請的|運營商的價值, 1<<n,即0000 0001向左移位n位。

例如1 << 30000 0001 << 2 = 0000 0100

實質上:做Bitset(8,3)會生成一個掩碼,只有第三位通過做1 << 3設置,得到0000 0100。 然後它將「或」這個掩碼設置爲8,給出:0000 1000 | 0000 0100,導致0000 1100,也就是說,您設置了8位的第三位。