C++ 了解enum成员';使用bitewise运算符初始化
我目前正在阅读《SFML游戏开发》一书以及第2段“接收器类别”子章第4章-输入处理;我们有: 我们定义了一个枚举来引用不同的类别。除“无”外,每个类别都用一个整数初始化,该整数的一位设置为1,其余的设置为0: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
我不明白 瞧,提前谢谢你,我希望我在这里的第一篇文章不要太混乱,我已经提供了足够的信息。 如果没有,我将编辑!:)
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