什么做了'|'关于函数参数吗?

时间:2016-06-14 06:04:54

标签: c++

我正在学习如何用C ++编写SDL程序,我遇到了这段代码:

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

我不知道这是否是特定的C ++功能?

我的猜测来自shell脚本背景表明它可能是一个管道(我知道它显然不是那个),或者它只是一个按位OR?

|在函数参数中使用它时的含义是什么?

2 个答案:

答案 0 :(得分:3)

这些是您可以设置的标志。在这种情况下,|引用按位运算符。

在您的示例中,这可以方便地通过单个参数组合多个标志。

假设两个标志具有以下值:

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

两者的逻辑按位OR将为flag留下值6。 我们可以很容易地从这个值确定使用按位AND。:

设置了哪些标志
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

请注意,此处标志为2的幂是很重要的,以确保所有标志组合都产生唯一值。

答案 1 :(得分: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,每个标志的位不同,这意味着您可以使用|组合它们。操作者...

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

...仍然能够使用按位AND(&)运算符检索原始标志:

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