c++ - 无法在 uint64 上正确转换我的值?

标签 c++ visual-c++

我无法理解如何在我的 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 的一些建议必须如何完成:

steam wiki recommendations

最佳答案

您似乎误解了 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/

相关文章:

windows - REBASE.EXE 的替代品是什么?

c# - 如何将IEnumerable与Process.Start的输出事件处理程序一起使用?

c++ - 如何将私有(private)数据附加到 libxml2 或 gdome dom 树

c++ - `ofstream` 与 0 相比

c++ - 将值传递给 main(int, char**)

c++ - 一个空类和一个空结构是如何编译的?

c++ - 程序已退出,代码为 -2147483645

c++ - ffmpeg:如何将 h264 原始数据保存为 mp4 文件

c++ - SDL2函数绘制实心圆

c++ - 顶点着色器的 OpenGL 属性名称