首页 > 解决方案 > 无法在 uint64 上正确转换我的值?

问题描述

我无法理解如何在 C++ 代码中正确移位:

uint64 iSteamId = FCString::Atoi(*gz_pid);

uint8 UniverseAccount = (iSteamId << 56) & 0xFF; // X
uint8 LowestBit = (iSteamId >> 63) & 0xFF; // Y
uint32 AccountNumber = (iSteamId << 32) & 0x7FFFFFF; // Z

gz_SteamId += "STEAM_" + \
    FString::FromInt(UniverseAccount) + ":" + \
    FString::FromInt(LowestBit) + ":" + \
    FString::FromInt(AccountNumber);

该图显示了您如何阅读 Steam 的一些建议,必须如何完成:

蒸汽维基推荐

标签: c++visual-c++

解决方案


您似乎误解了 C++ 中位和移位的工作原理。

开始:最低(最低有效)位是 number 0。在 64 位数字上,最高(最高有效)位是 number 63

向右移动将高位移动到较低的位置,在顶部用零位填充。向左移动位移动到更高的位置,在底部填充零位。

如果您有字节0b1000000(十进制128)并将其向右移动一个位置(使用>>),您将得到0b01000000(十进制64)。

如果您有字节0b00000001(十进制1)并将其向左移动一位(使用<<),您将得到0b00000010(十进制2)。


对于您的问题:

最低位不需要进行任何移位,它始终是您获得的最低位,例如iSteamId & 1.

接下来的 31 位向下移动一位以删除最低位,并使用 31 个最低位进行掩码:(iSteamId >> 1) & 0x7fffffff.

对于前八位,您向下移动 56 位,然后让编译器截断结果:iSteamId >> 56.

这些转换假定 Intel little-endian 系统


推荐阅读