我无法理解如何在我的 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++ 中位和移位的工作方式。
开始:最低(最低有效)位是数字 0
.在 64 位数字上,最高(最重要)位是数字 63
.
向右移 会将高位移动到较低位置,并在顶部填充零位。向左移动会将位移动到更高的位置,并在底部填充零位。
如果你有字节 0b1000000
(十进制 128
)并将其向右 移动一个位置(使用 >>
)你得到 0b01000000
(十进制 64
)。
如果你有字节 0b00000001
(十进制 1
)并将其向左边 移动一个位置(使用 <<
)你得到 0b00000010
(十进制 2
)。
针对您的问题:
最低位不需要任何移位,它始终是您获得的最低位,例如iSteamId & 1
.
接下来的 31 位向下移动一位以移除最低位,并用最低 31 位屏蔽:(iSteamId >> 1) & 0x7fffffff
.
对于前 8 位,您向下移动 56 位,让编译器截断结果:iSteamId >> 56
.
这些转变假定英特尔 little-endian system .
关于c++ - 无法在 uint64 上正确转换我的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58918207/