【发布时间】:2014-08-17 22:07:43
【问题描述】:
我目前正在阅读“SFML 游戏开发”一书以及第 4 章 - 输入处理子章节“接收器类别”第 n°2 段;我们有这个:
“我们定义一个枚举来引用不同的类别。除了 None 之外的每个类别都用一个整数初始化,其中一位设置为 1 ,其余设置为 0 :”
namespace Category
{
enum Type
{
None = 0,
Scene = 1 << 0,
PlayerAircraft = 1 << 1,
AlliedAircraft = 1 << 2
EnemyAircraft = 1 << 3,
};
}
一般来说,我对位运算符和二进制运算不太满意;所以我不明白“除了 None 之外的每个类别都用一个整数初始化,其中一位设置为 1 ,其余的设置为 0 :”。
如果每个类别(除了None)都如上所述初始化,“其余”设置为0是什么?!
注意:经过仔细阅读,我想我明白枚举的每个成员都是一个字节,因此,其中的第一位设置为 1,同一字节的其他位是设置为 0。
所以,Scene = 0b1,PlayerAircraft = 0b10(一个位 = 1,另一个 = 0)等等......所以如果我写:PlayerAircraft = 2 << 1 PlayerAircraft 会等于 0b11?我是对的还是我遗漏了什么?
在本章中进一步介绍;我们有一个if 条件检查请求的类别是否与场景节点一相同;不偏离主题;我不明白那部分。
因为它使用AND(或&,如果您愿意)按位运算符;它如何检查场景节点类别是否与请求的类别相同?
我在 Wikipedia 上查看了它是如何工作的,但我没有完全明白。
这是代码
void SceneNode::onCommand(const Command& command, sf::Time dt)
{
if(command.category & getCategory()) //The part I don't understand
command.action(*this, dt);
/* ... */
}
我不明白...
Voilà,提前谢谢你,我希望我在这里的第一篇文章不会太乱,并且我提供了足够的信息。 如果没有,我会编辑! :)
PS:对不起英语蹩脚,我今天还没醒。
【问题讨论】:
-
1<<0计算结果为 1 (00000001)。1<<1计算结果为 2 (00000010)。1<<2计算结果为 4 (00000100)。1<<3计算结果为 8 (00001000)。它是位移,您可以将其视为分别通过左/右移位乘以/除以2。我假设正在这样做,以便他们稍后可以在此枚举中使用bitmask。
标签: c++ struct enums bitwise-operators