この演算子がわかりません。それは何をするためのものか?
これが私が見つけた場所の例です:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
この演算子がわかりません。それは何をするためのものか?
これが私が見つけた場所の例です:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
それはビット単位の OR です。この場合、ビットマスクを作成するのに役立ちます。これらのフラグは、1 つのビットが設定された数値の定義であり、それらを OR すると、両方のビットが設定された数値になります。
例: これらのフラグの正確な値はわかりませんが、次のように想像してみましょう:
#define GL_COLOR_BUFFER_BIT 0x01
#define GL_DEPTH_BUFFER_BIT 0x08
これらをバイナリで書き出すと、次のようになります。
GL_COLOR_BUFFER_BIT = 00000001
GL_DEPTH_BUFFER_BIT = 00001000
GL_COLOR_BUFFER_BIT
そして、それらをビットごとに OR すると、そのビットがいずれかのOR に設定されている場合、出力のビットが 1 に設定されますGL_DEPTH_BUFFER_BIT
。
GL_COLOR_BUFFER_BIT = 00000001
GL_DEPTH_BUFFER_BIT = 00001000
= 00001001
したがって、番号 0x09 になります。
呼び出している関数は、渡された数値を調べ、設定されているビットに基づいて、渡されているフラグを認識します。
ビット単位または演算子です。ビット単位または以下に示すように機能します。
2バイトのa、bがあると仮定しましょう。
a = 0 0 1 1 0 1 0 1
b = 1 0 1 1 0 0 0 0
ビット演算子はで動作しbit level
ます。何が起こるかというと、各ビットが順番に取得され、or操作が実行されます。少なくとも1つ(または両方)のビットが1の場合、結果バイトの対応するビットも1になります。両方が0の場合、結果ビットも0になります。
したがって、ビット単位またはaとbでこれを行います。
a = 0 0 1 1 0 1 0 1
b = 1 0 1 1 0 0 0 0
c = 1 0 1 1 0 1 0 1
最初のビット0と1。1があるので、cのビットは1になります。2番目のビットは0と0なので、次の結果ビットは0になります。3番目のビットは両方とも1です。少なくとも1つの1が存在するため、cの次のビットは1...などになります。
それがあなたのためにそれをクリアすることを願っています。
PS。ここではダミービットを使用しましたが、GL_COLOR_BUFFER_BIT
またはで使用される実際の値に対応しているわけではありませんGL_DEPTH_BUFFER_BIT
。
ほとんどの場合、ビット演算子は、値にマスクを適用したり、2つの値を組み合わせたりするために使用されます。
|
2つを一緒に組み合わせると
&
マスクが適用されます
値が与えられ、それをこのように見せたいと仮定しましょう(&
そのマスクを適用するために使用します)。
0 0 0 1 1 1 1 0
0は値がないはずの場所に対応し、1は関心があり正確にしたいビットに対応します。
a = 1 0 1 0 0 1 1 0
mask = 0 0 0 1 1 1 1 0
これで、0を超えるaのすべてのビットが削除され、結果はこれらのビットに0になります。これは、および&の場合、ビット1になるには両方のビットが1である必要があるためです。
マスクに1がある場合、結果として潜在的な1が発生します。したがって、各ビットで&を使用すると、この値になります。
result = 0 0 0 0 0 1 1 0
結果をよく見ると、マスクの1と同じ位置にある4ビットはaから移動されます。つまり、実際に行われたのは、マスクのビットが0で、1のビットを保持することでした。
使用している言語によって少し異なりますが、多くの場合、これはビット単位の orです。これは、ビットとしてエンコードされた複数のフラグを関数に渡すためによく使用されます。たとえば、2 つのフラグがある場合
const char FLAG_1 = 0x01;
const char FLAG_2 = 0x02;
それではFLAG_1 | FLAG_2
です0x03
。ビットごとに素なビットの場合、これは加算と同じですが、最初は混乱する可能性があります。呼び出しでは、ビットは OR されます
func( FLAG_1 | FLAG_2) // set both FLAG_1 and FLAG_2
関数は、ビットごとのandfunc
を使用してビットを個別にテストできます。
void func( char flags ) {
if( flag & FLAG_1 ) { // test for FLAG_1
}
if( flag & FLAG_1 ) { // test for FLAG_2
}
}