17

誰かがこのビット演算構文を説明できますか?

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

のビットを設定することは知っていますがvar、構文を理解できません。

4

3 に答える 3

29

それを少しずつ分解してみましょう:

1ULunsigned long int、ビットレベルで次のように表される値1のです。

00000000000000000000000000000001

これ<<は「ビットシフト」演算子であり、上の値のすべてのビットを左bitnoの回数だけ移動します。の場合は1UL<<5、次のようになります。

00000000000000000000000000100000

この値を取得すると、|=(これは割り当てを伴うビットごとのOR演算varです)、基本的に、それに一致するビットを強制的1にaにし1、他のビットに触れないようにしX | 0 = Xます。

varis37bitnoisとしましょう7。そうすると、ビットレベルのすべてが次のようになります。

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

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

最後に、明確でない場合は、関数のようなマクロとして#defineマークを付けます。Bitset

于 2013-01-22T20:17:49.110 に答える
5

これはマクロです。プリプロセッサがそのようなステートメントをヒットするたびに、Bitset(var,bitno)それを忠実に置き換えます

var = var | 1UL << (bitno)

これをさらに説明します。

ここでのULは、 UnsignedLongを意味します。

操作には演算子|を使用しbitwise ORます。したがって、変数varORedで編集 され1UL << bitno、に割り当てられます。var

次に、プログラムの性質に応じて、実行時またはコンパイル時に、

言うことvar01000110 ありbitno5

その後1UL << 5 = 32または00100000

それから

var = 01000110 | 00100000 

すなわちvar = 01100110

于 2013-01-22T20:16:29.100 に答える
1

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

于 2013-01-22T20:17:24.190 に答える