gpt4 book ai didi

c - 使用位掩码和 if 语句

转载 作者:行者123 更新时间:2023-11-30 17:15:55 25 4
gpt4 key购买 nike

我试图允许多个案例在 switch 语句中运行。我有一个位掩码如下:

#define SHOOT_ROCKET 2 << 16
#define MOVE_FORWARD 3 << 16

以后我会的

switch (int game_action)

我有

case SHOOT_ROCKET:
result = fire_weapon(rl);

我不想“中断”,因为我想要多种操作的可能性。但我返回一个名为“结果”的值。我将其存储为变量并在最后返回。我可以告诉其他情况:语句正在运行,即使它们不应该运行,因为结果不断变化,如果我添加中断,则不会;

处理这个问题的最佳方法是什么?

更新:我被告知要这样做。

我更改了我的 << 位掩码,因此它们现在从 1 开始。

我遇到了一个奇怪的错误

if (game_action->action & SHOOT_ROCKET)
{
game_action->data=5;
}
if (game_action->action & MOVE_FORWARD)
{
game_action->data=64;
}

当我打算将多个 if 评估为 true 时,我不担心 game_action 被覆盖

但是:即使我只尝试发射火箭,MOVE_FORWARD 似乎也会发生!

game_action 通常是一个 void 指针,因此它在函数中的设置方式如下:

game_action = (game_action) *game_action_ptr;

我已验证位掩码是否正确

printf("%d", game_action->action >> 16) which prints 2.

那么为什么当我只是想发射火箭时会出现“3”(前进)呢?

最佳答案

请更新您的问题。

So why is '3' (the move forward) happening when I am only trying to shoot a rocket?

您首先要查看的是

#define SHOOT_ROCKET 2 << 16
#define MOVE_FORWARD 3 << 16

并思考其评估结果。它将计算出以下二进制数(Python 对于这类东西很方便,0b 只是一个前缀,表示后面是二进制数):

>>> bin(2 << 16)
'0b100000000000000000'
>>> bin(3 << 16)
'0b110000000000000000'

所以你会看到你在 #define 中使用了两次一位s(退休忍者已经指出了这一点)。这意味着如果 game_action->action设置为位 2 << 16 的任何值是 1 ,你的两个 if 都会评估为 true,因为 #define将该位设置为 1 .

to make them mutually exclusive, should i do 2, 4, 8, instead of 1,2,3,4?

如果您想轻松跟踪使用了哪些位,您可以使用 2 的幂(1,2,4,8,16 等),例如#define MOVE_FORWARD 4 (我忽略了 << 16 你有,你可以添加它,如果你愿意),或者你可以移动 1通过可变位数,两者都会产生相同的二进制数:

#define MOVE_LEFT 1 << 0
#define MOVE_RIGHT 1 << 1
#define MOVE_UP 1 << 3
#define MOVE_DOWN 1 << 4

在某些合法情况下,位掩码需要设置多个位,例如检查是否设置了多个位中的任何一位:

#define MOVE_LEFT ... (as above)
#define SHOOT_ROCKET 1 << 5
#define SHOOT_GUN 1 << 6
//...
#define ANY_MOVEMENT 0xF
#define ANY_WEAPON_USE 0xF << 4

然后检查:

if (action & ANY_MOVEMENT) { ... }
if (action & ANY_WEAPON_USE) { ... }

关于c - 使用位掩码和 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29833579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com