誰かがこのビット演算構文を説明できますか?
#define Bitset(var,bitno) ((var) |=1UL<<(bitno))
のビットを設定することは知っていますがvar、構文を理解できません。
誰かがこのビット演算構文を説明できますか?
#define Bitset(var,bitno) ((var) |=1UL<<(bitno))
のビットを設定することは知っていますがvar、構文を理解できません。
それを少しずつ分解してみましょう:
1ULはunsigned long int、ビットレベルで次のように表される値1のです。
00000000000000000000000000000001
これ<<は「ビットシフト」演算子であり、上の値のすべてのビットを左bitnoの回数だけ移動します。の場合は1UL<<5、次のようになります。
00000000000000000000000000100000
この値を取得すると、|=(これは割り当てを伴うビットごとのOR演算varです)、基本的に、それに一致するビットを強制的1にaにし1、他のビットに触れないようにしX | 0 = Xます。
varis37とbitnoisとしましょう7。そうすると、ビットレベルのすべてが次のようになります。
00000000000000000000000000100101 // var
00000000000000000000000010000000 // 1UL<<7
00000000000000000000000010100101 // var | (1UL<<7)
最後に、明確でない場合は、関数のようなマクロとして#defineマークを付けます。Bitset
これはマクロです。プリプロセッサがそのようなステートメントをヒットするたびに、Bitset(var,bitno)それを忠実に置き換えます
var = var | 1UL << (bitno)
これをさらに説明します。
ここでのULは、 UnsignedLongを意味します。
操作には演算子|を使用しbitwise ORます。したがって、変数varはORedで編集
され1UL << bitno、に割り当てられます。var
次に、プログラムの性質に応じて、実行時またはコンパイル時に、
言うことvarは01000110
ありbitno、5
その後1UL << 5 = 32または00100000
それから
var = 01000110 | 00100000
すなわちvar = 01100110
var = 8と言います。これは0000 1000、バイナリです。
もし、するなら
8 | 16どちらかのビットが1の場合、オペレーターがビットを設定するため、0000 1000 | 0001 0000どちらが得られるかがわかります。0001 1000|
したがって、|演算子を値とに適用します1<<n。つまり0000 0001、nビットを左にシフトします。
たとえば、1 << 3です0000 0001 << 2 = 0000 0100。
本質的には、doingは、Bitset(8,3)getingを実行することにより、3番目のビットのみが設定されたマスクを生成します。次に、このマスクを8に「または」 、次のように指定します。つまり、8の3番目のビットを設定します。1 << 30000 01000000 1000 | 0000 01000000 1100