2016-06-14 2 views
-3

私はC++でSDLプログラムの書き方を学んでいます、と私は、このコードに出くわした:何が '|' on関数のパラメータdo?

SDL_Renderer *ren = 
    SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); 
//              ^I have no idea what this means? 

私は、これは、特定のC++の機能であればtは知っているドン?

シェルスクリプトの背景から推測すると、パイプ(私は明らかにそのことは分かっていません)か、ビット単位のOR(idkならどちらでもかまいません)のようです。

上記のコードのような関数パラメータで|を使用するとどういう意味がありますか?

+3

[ビット単位の論理演算子](http://en.cppreference.com/w/cpp/language/operator_arithmetic#Bitwise_logic_operators)を参照してください。 – songyuanyao

+0

ビット演算子OR'ing演算子です。 '01 | 10 = 11' – Arunmu

+1

非常に便利なgooglestring: "C++演算子"。あなたが本を持っているなら、演算子はインデックスにあります。 (あなたはそれらのもっと多くを見たいと思うだろう)あなたが本を持っていないなら、[ここ]を見てください(http://stackoverflow.com/questions/388242/the-definitive-c-book-guide - と - リスト)を購入する前に。 – molbdnilo

答えて

3

これらは、ユーザーが設定できるフラグです。この場合、|はビット単位の演算子を参照します。

この例では、1つのパラメータで複数のフラグを組み合わせることができます。

は二つのフラグは、次の値があるとします。

SDL_RENDERER_SOFTWARE = 1 // Binary 0001 
SDL_RENDERER_ACCELERATED = 2 // Binary 0010 
SDL_RENDERER_PRESENTVSYNC = 4 // Binary 0100 

ロジックビット単位のOR 2のを、flagの値6を残すでしょう。 我々は簡単にフラグをビット単位のANDフラグは、2の累乗になるように、すべてのフラグの組み合わせがユニークな値になることを確認することがここで重要なのだと。:

flag = SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC // flag = 6 (0110) 
flag & SDL_RENDERER_SOFTWARE == 0 // Not set 
flag & SDL_RENDERER_ACCELERATED == 2 // Set 
flag & SDL_RENDERER_PRESENTVSYNC == 4 // Set 

注意を使用して設定されているこの値から判断することができます。

+0

なので、基本的には、SDL_RENDERER_ACCELERATEDとSDL_RENDERER_PRESENTVSYNCの両方をCreateRendererに渡すことを意味します。 – hoholee12

+0

@ hoholee12正解。 –

+0

今日、新しいことを学んだ、ありがとう! :D – hoholee12

0

|bitwise OR operatorであり、この場合はSDL_CreateRenderer関数にフラグセットを渡すために使用されます。

フラグのセットを想像:

const int FLAG1 = 0x1 << 0; // 0b00...0001 
const int FLAG2 = 0x1 << 1; // 0b00...0010 
const int FLAG3 = 0x1 << 2; // 0b00...0100 
/* ... */ 

あなたはこれらのフラグのバイナリ表現からわかるように、彼らは1ビットだけが1に設定されており、このビットはあなたのことを意味し、各フラグに異なるです... ... |演算子を使用して

int flag_a = FLAG1 | FLAG2; // 0b00...0011 
int flag_b = FLAG1 | FLAG3; // 0b00...0101 

、それらを組み合わせることができ、まだビット単位のAND(&)演算子を使用して、元のフラグ取得できる一方:

を10
int is_flag1_set = flag_a & FLAG1; // 0b00...0001 != 0 
int is_flag2_set = flag_a & FLAG2; // 0b00...0010 != 0 
int is_flag3_set = flag_a & FLAG3; // 0b00...0000 == 0 
関連する問題