我知道存在按位操作这样的事情,但这是我第一次需要处理它们。我有这段代码:
if (bonus_value + (skill_value & 0x3F) < 60)
result = bonus_value + skill_value;
else
result = skill_value & 0xFFFC | 0x3C;
return result;
任何人都可以帮助我理解它吗?如果没有那些奇怪的按位东西怎么能改写呢?我可以看到这段代码可能会有一些限制,但我不敢在某种程度上重写它时犯错误。
或者在这里拥有它们实际上很重要,它还有其他功能,而不是结果钳位?你觉得怎么样?
答案 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_value
和skill_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以获取该数字的最后一位。