带有奇数'&的C ++代码行0x3'按位运算符

时间:2016-09-27 12:14:36

标签: c++ bitwise-operators

我知道存在按位操作这样的事情,但这是我第一次需要处理它们。我有这段代码:

if (bonus_value + (skill_value & 0x3F) < 60)
    result = bonus_value + skill_value;
else
    result = skill_value & 0xFFFC | 0x3C;
return result;

任何人都可以帮助我理解它吗?如果没有那些奇怪的按位东西怎么能改写呢?我可以看到这段代码可能会有一些限制,但我不敢在某种程度上重写它时犯错误。

或者在这里拥有它们实际上很重要,它还有其他功能,而不是结果钳位?你觉得怎么样?

3 个答案:

答案 0 :(得分:3)

if (bonus_value + (skill_value & 0x3F) < 60)
    result = bonus_value + skill_value;
else
    result = skill_value & 0xFFFC | 0x3C;
return result;

相当于

if (bonus_value + (skill_value % 64) < 60)
    result = bonus_value + skill_value;
else
    result = (((skill_value % 65536) / 4) * 4) | 60;
return result;

答案 1 :(得分:2)

让我们一行一行。为简单起见,我们假设skill_value是一个16位无符号整数(请在下次提供类型)。

if (bonus_value + (skill_value & 0x3F) < 60)

这里的掩码是一种特殊情况:e 0x3F比一个2的幂弱一个。在这种情况下,可以使用模运算符(%)重写它。 当且仅当bonus_value + (skill_value % 64)不超过60时,条件为真。

    result = bonus_value + skill_value;

这应该说明一切:如果条件为真,则结果为bonus_valueskill_value之和。

else
    result = skill_value & 0xFFFC | 0x3C;

这很奇怪。 &|将低6位替换为0x3C& - 掩码用零替换最低的两位,| - 掩码替换位2到5由1)。您可以使用(skill_value & 0xFFC0) + 0x3C获得相同的效果。这个新的& - 掩码将skill_value向下舍入为64的倍数,因此:如果条件为false,则结果为skill_value向下舍入为64的倍数,加60。

return result;

就是这样。由于该问题没有为任何这些值指定任何含义,因此这是我们可以获得的描述。

答案 2 :(得分:0)

如果将十六进制数转换为二进制 -

0x3F = 0000 0000 0011 1111 0xFFFC = 0000 0000 1111 1111 1111 1100

您会看到相应的&操作aloos以获取该数字的最后一位。