Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 了解enum成员';使用bitewise运算符初始化_C++_Struct_Enums_Bitwise Operators - Fatal编程技术网

C++ 了解enum成员';使用bitewise运算符初始化

C++ 了解enum成员';使用bitewise运算符初始化,c++,struct,enums,bitwise-operators,C++,Struct,Enums,Bitwise Operators,我目前正在阅读《SFML游戏开发》一书以及第2段“接收器类别”子章第4章-输入处理;我们有: 我们定义了一个枚举来引用不同的类别。除“无”外,每个类别都用一个整数初始化,该整数的一位设置为1,其余的设置为0: 我不明白 瞧,提前谢谢你,我希望我在这里的第一篇文章不要太混乱,我已经提供了足够的信息。 如果没有,我将编辑!:) PS:对不起,我今天不够清醒。&是位运算符和。如果两位(运算符的左操作数和右操作数)也等于1,则其应用结果等于1。否则结果为0 例如,假设sf::Time dt的值Alli

我目前正在阅读《SFML游戏开发》一书以及第2段“接收器类别”子章第4章-输入处理;我们有:

我们定义了一个枚举来引用不同的类别。除“无”外,每个类别都用一个整数初始化,该整数的一位设置为1,其余的设置为0:


我不明白

瞧,提前谢谢你,我希望我在这里的第一篇文章不要太混乱,我已经提供了足够的信息。 如果没有,我将编辑!:)


PS:对不起,我今天不够清醒。

&是位运算符和。如果两位(运算符的左操作数和右操作数)也等于1,则其应用结果等于1。否则结果为0

例如,假设
sf::Time dt
的值
AlliedAircraft
定义为
AlliedAircraft=1 What's
运算符这不是真正的初始化-枚举项是编译时常量,位表达式在编译时求值

每个成员的二进制表示形式为:

 None           : 00000000
 Scene          : 00000001
 PlayerAircraft : 00000010
 AlliedAircraft : 00000100
 EnemyAircraft  : 00001000
虽然实际的位数会更大——我只显示了最低有效的8位,其余的都是零

当一个值可能同时表示多个值时,可以使用此类型的枚举-例如,
PlayerAircraft | Scene
的组合具有唯一值00000011;虽然并非
PlayerAircraft | Scene
的类型为
int
,而不是
type
,但在这种情况下,不清楚这是位掩码的用途

使用bit shift常量表达式可能只是为了明确每个枚举都设置了一个位。你不妨这样写:

 None           = 0x00,
 Scene          = 0x01,
 PlayerAircraft = 0x02,
 AlliedAircraft = 0x04,
 EnemyAircraft  : 0x08
通常使用十六进制表示法,因为它是二进制值的简洁表示法,因为一个数字正好对应于4个二进制数字

要测试是否设置了二进制值中的单个位,请按位-&要测试的掩码的值。例如:

value      : 1001
Scene Mask : 0001
-----------------
         & : 0000  // Non-zero - value Scene bit is set


value       : 1001
Player Mask : 0010
------------------
          & : 0000  // Zero - Value Palyer bit is not set

1@flaco作者不是我;是D
0b010
&
0b100
=====
0b000
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 1 // 2 ^ 0 = 1
0 0 0 0 0 0 1 0 // 2 ^ 1 = 2
0 0 0 0 0 1 0 0 // 2 ^ 2 = 4
0 0 0 0 1 0 0 0 // 2 ^ 3 = 8
...
0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 1
0 0 0 0 0 1 0 0 &
0 0 0 0 0 0 1 1 =
0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 &
0 0 0 0 0 1 0 1 =
0 0 0 0 0 1 0 0
0 0 0 1 // A
0 0 1 0 // C
0 1 0 0 // G
1 0 0 0 // T
0 1 0 1 // A + G
0 1 0 1 & // A + G
0 0 0 1 = // A
0 0 0 1   // 1 ~ true
0 1 0 1 & // A + G
0 0 1 0 = // C
0 0 0 0   // 0 ~ false
0 1 0 1 & // A + G
0 1 0 0 = // G
0 1 0 0   // 4 ~ true
0 1 0 1 & // A + G
1 0 0 0 = // T
0 0 0 0   // 0 ~ false
if (a & b)
if ((a & b) == a)
enum type
    { none              = 0
    , scene             = 1 << 0
    , player_aircraft   = 1 << 1
    , allied_aircraft   = 1 << 2
    , enemy_aircraft    = 1 << 3 };
auto a = scene;
auto b = enemy_aircraft;
auto c = player_aircraft;
    std::cout << "a is of type: " << ((a & scene) ? "scene" : "not scene") << '\n';    
    std::cout << "b is of type: " << ((b & enemy_aircraft) ? "enemy_aircraft" : "not enemy_aircraft") << '\n'; 
    std::cout << "c is of type: " << ((c & player_aircraft) ? "player_aircraft" : "not player_aircraft") << '\n'; 
 None           : 00000000
 Scene          : 00000001
 PlayerAircraft : 00000010
 AlliedAircraft : 00000100
 EnemyAircraft  : 00001000
 None           = 0x00,
 Scene          = 0x01,
 PlayerAircraft = 0x02,
 AlliedAircraft = 0x04,
 EnemyAircraft  : 0x08
value      : 1001
Scene Mask : 0001
-----------------
         & : 0000  // Non-zero - value Scene bit is set


value       : 1001
Player Mask : 0010
------------------
          & : 0000  // Zero - Value Palyer bit is not set