2013-01-22 7 views
7

誰でも次の構文を説明できますか?アンシCのビット設定

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

私はそれがvarのビットをセットするけど、私は、構文を理解することはできません。

+1

シンタックスは、まったく目立たないC演算子で構成されています。それについては珍しいことはありません。正確に何を説明したいですか?あなたが基本的なC演算子の意味を知らないなら、それはあなたが*本*で読むことができるものです。これは "Cの一般的な表現の構文を説明する"ための場所ではありません。特定のものを理解することに問題がある場合は、それが何であるかを言わなければなりません。 – AnT

+0

マクロです。マクロ名 "Bitset"を "var"と "bitno"のマクロの位置パラメータで置き換え、その後の文字で置き換えます。それをよりよく理解するために、不要な括弧をはがしてください。 –

+0

めったに使用されない "1UL"によって投げられることがあります。これは、符号なしのロングフォームのリテラル1です。 –

答えて

13

ピースによって片のそれを打破しよう:

1ULは、ビットレベルで表される1の値を有するunsigned long intある:

00000000000000000000000000000001 

<<は、「ビットシフト」演算子でありますその値のすべてのビットを左にbitno回移動します。この値を持っていたら、(割り当てとbitwise OR operationです)|=は本質的であることをその1に沿ったものでありますvarのビットを強制します

00000000000000000000000000100000 

:それは1UL<<5だ場合は、になってしまいます1及び習慣タッチ任意の他のビット(X | 0 = X)ため

var37bitno7であると言うことができます。そして、ビットレベルですべてが次のようになります。

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

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

最後に、ケースには、function-like macroとして#defineマークBitset明確ではありません。

2

これはマクロです。プリプロセッサはBitset(var,bitno)のような文を打つたびに、忠実にこれを説明するために

var = var | 1UL << (bitno) 

さらにに置き換えます。

ここで、は、を意味します。符号なしロングを意味します。

オペレータ|は、bitwise ORオペレーションに使用されます。その変数varOR 1UL << bitnoとEDとランタイムまたはプログラムの性質に応じて時間をコンパイル時に戻っvar

に割り当てられ、

セイvar01000110bitnoです5です

1UL << 5 = 32または00100000

次いで

var = 01000110 | 00100000 

var = 01100110

+3

コードの書き換えはどのように問題に答えますか? – nico

+0

@nico私は他の人と競合しています。 –

+0

はそれが競争だったことを知らなかった – nico

0

セイVAR = 8、すなわち、それはバイナリで0000 1000あります。

あなたは

8 | 16を行う場合|オペレータはビットを設定しますので、あなたがいずれかのビットが1

であれば、あなたの値に|演算子を適用している、あなたに0001 1000を与えるであろう0000 1000 | 0001 0000を持つことになりますし、 1<<nであり、すなわち、0000 0001は、左側にnビットシフトされている。

たとえば1 << 30000 0001 << 2 = 0000 0100です。

Bitset(8,3)を実行すると、1 << 3を実行して0000 0100になることによって設定された3番目のビットのみが設定されたマスクが生成されます。 このマスクを "8"に設定すると、0000 1000 | 0000 0100となり、結果として0000 1100になります。つまり、3番目のビットを8に設定します。

関連する問題