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

C++ line of code with odd '& 0x3' bitwise operator

我知道有按位运算之类的东西,但是第一次接触。我有这个代码:

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 & 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;

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

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

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

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

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

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

    result = bonus_value + skill_value;

这应该不言而喻:如果条件为真,结果是bonus_valueskill_value的总和。

else
    result = skill_value & 0xFFFC | 0x3C;

这很奇怪。 &| 将低六位替换为 0x3C&-掩码将最低两位替换为零,而 |-掩码将替换第 2 位到第 5 位)。您可以使用 (skill_value & 0xFFC0) + 0x3C 达到相同的效果。这个新的 &-mask 向下舍入 skill_value 为 64 的倍数,因此: 如果条件为假,结果 skill_value 向下舍入为 64 的倍数64,加上60.

return result;

就是这样。由于问题没有为这些值中的任何一个指定任何 含义,因此这是我们所能得到的描述性的。