我正在学习如何用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?
|
在函数参数中使用它时的含义是什么?
答案 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