誰かがこのビット演算構文を説明できますか?
#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
ます。
var
is37
とbitno
isとしましょう7
。そうすると、ビットレベルのすべてが次のようになります。
00000000000000000000000000100101 // var
00000000000000000000000010000000 // 1UL<<7
00000000000000000000000010100101 // var | (1UL<<7)
最後に、明確でない場合は、関数のようなマクロとして#define
マークを付けます。Bitset
これはマクロです。プリプロセッサがそのようなステートメントをヒットするたびに、Bitset(var,bitno)
それを忠実に置き換えます
var = var | 1UL << (bitno)
これをさらに説明します。
ここでのULは、 UnsignedLongを意味します。
操作には演算子|
を使用しbitwise OR
ます。したがって、変数var
はOR
edで編集
され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 << 3
0000 0100
0000 1000 | 0000 0100
0000 1100