誰でも次の構文を説明できますか?アンシCのビット設定
#define Bitset(var,bitno) ((var) |=1UL<<(bitno))
私はそれがvar
のビットをセットするけど、私は、構文を理解することはできません。
誰でも次の構文を説明できますか?アンシCのビット設定
#define Bitset(var,bitno) ((var) |=1UL<<(bitno))
私はそれがvar
のビットをセットするけど、私は、構文を理解することはできません。
ピースによって片のそれを打破しよう:
1UL
は、ビットレベルで表される1の値を有するunsigned long int
ある:
00000000000000000000000000000001
<<
は、「ビットシフト」演算子でありますその値のすべてのビットを左にbitno
回移動します。この値を持っていたら、(割り当てとbitwise OR operationです)|=
は本質的であることをその1
に沿ったものでありますvar
のビットを強制します
00000000000000000000000000100000
:それは1UL<<5
だ場合は、になってしまいます1
及び習慣タッチ任意の他のビット(X | 0 = X
)ため
はvar
が37
とbitno
が7
であると言うことができます。そして、ビットレベルですべてが次のようになります。
00000000000000000000000000100101 // var
00000000000000000000000010000000 // 1UL<<7
00000000000000000000000010100101 // var | (1UL<<7)
最後に、ケースには、function-like macroとして#define
マークBitset
明確ではありません。
これはマクロです。プリプロセッサはBitset(var,bitno)
のような文を打つたびに、忠実にこれを説明するために
var = var | 1UL << (bitno)
さらにに置き換えます。
ここで、は、を意味します。符号なしロングを意味します。
オペレータ|
は、bitwise OR
オペレーションに使用されます。その変数var
はOR
1UL << bitno
とEDとランタイムまたはプログラムの性質に応じて時間をコンパイル時に戻っvar
に割り当てられ、
セイvar
は01000110
とbitno
です5
です
1UL << 5 = 32
または00100000
次いで
var = 01000110 | 00100000
var = 01100110
セイVAR = 8、すなわち、それはバイナリで0000 1000
あります。
あなたは
8 | 16
を行う場合|
オペレータはビットを設定しますので、あなたがいずれかのビットが1
であれば、あなたの値に|
演算子を適用している、あなたに0001 1000
を与えるであろう0000 1000 | 0001 0000
を持つことになりますし、 1<<n
であり、すなわち、0000 0001
は、左側にnビットシフトされている。
たとえば1 << 3
は0000 0001 << 2 = 0000 0100
です。
Bitset(8,3)
を実行すると、1 << 3
を実行して0000 0100
になることによって設定された3番目のビットのみが設定されたマスクが生成されます。 このマスクを "8"に設定すると、0000 1000 | 0000 0100
となり、結果として0000 1100
になります。つまり、3番目のビットを8に設定します。
シンタックスは、まったく目立たないC演算子で構成されています。それについては珍しいことはありません。正確に何を説明したいですか?あなたが基本的なC演算子の意味を知らないなら、それはあなたが*本*で読むことができるものです。これは "Cの一般的な表現の構文を説明する"ための場所ではありません。特定のものを理解することに問題がある場合は、それが何であるかを言わなければなりません。 – AnT
マクロです。マクロ名 "Bitset"を "var"と "bitno"のマクロの位置パラメータで置き換え、その後の文字で置き換えます。それをよりよく理解するために、不要な括弧をはがしてください。 –
めったに使用されない "1UL"によって投げられることがあります。これは、符号なしのロングフォームのリテラル1です。 –