带有奇数 '& 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_value
和skill_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;
就是这样。由于问题没有为这些值中的任何一个指定任何 含义,因此这是我们所能得到的描述性的。
我知道有按位运算之类的东西,但是第一次接触。我有这个代码:
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_value
和skill_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;
就是这样。由于问题没有为这些值中的任何一个指定任何 含义,因此这是我们所能得到的描述性的。