0

この演算子がわかりません。それは何をするためのものか?

これが私が見つけた場所の例です:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
4

3 に答える 3

4

それはビット単位の 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 になります。

呼び出している関数は、渡された数値を調べ、設定されているビットに基づいて、渡されているフラグを認識します。

于 2013-02-24T13:28:07.920 に答える
0

ビット単位または演算子です。ビット単位または以下に示すように機能します。

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のビットを保持することでした。

于 2013-02-24T13:33:07.803 に答える
0

使用している言語によって少し異なりますが、多くの場合、これはビット単位の 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
     }
}
于 2013-02-24T13:41:09.580 に答える