gpt4 book ai didi

c++ - 从奇怪的版本字符串中提取数字

转载 作者:太空狗 更新时间:2023-10-29 23:45:30 27 4
gpt4 key购买 nike

我有一个应用程序的版本号,格式为 0x00870016,其中前 4 位十六进制数字代表版本号的第一部分,后 4 位代表第二部分,因此在此示例中版本号为 135.22。

我正在尝试弄清楚(在 C++ 中)如何分别提取这些数字以将它们显示为字符串。

最佳答案

通过结合使用 mask 和移位:

int main()
{
const uint32_t v = 0x00870016;
const uint16_t major = (v & 0xFFFF0000) >> 16;
const uint16_t minor = v & 0x0000FFFF;
cout << major << "." << minor << "\n";
}

输出:

135.22

解释:

0x00870016 是一个 32 位数字。您的主版本号由 16 位最高有效数字组成,次版本号由 16 位最低有效数字组成。

为了提取主版本号,让我们通过用 0xFFFF0000 屏蔽输入值来找出 16 位 MSBits -- 一个数字,其中所有 16 个最重要的数字都设置为1 并且所有的最小信号位都是0:

0x00870016 && 0xFFFF0000 = 0x00870000

结果值是您的主版本号,左移 16 位。所以让我们把它移过来:

0x00870000 >> 16 = 0x00000087

我们有您真正的主要版本号。

提取次要版本号是类似的,除了我们不必转移。

注意:

第一步可以通过跳过掩码来简化:

const uint16_t major = v >> 16;

这是有效的,因为 C++ 标准规定当您向右移动时,空出的位将填充 0。所以最终的程序是:

int main()
{
const uint32_t v = 0x00870016;
const uint16_t major = v >> 16;
const uint16_t minor = v & 0x0000FFFF;
cout << major << "." << minor << "\n";
}

编辑:

如评论中所述,您可能会得到字符串形式的 0x00870016,而不是数字。我们只需要将这个字符串转换成它的数字等价物。处理前导 0x 可能看起来像一个绊脚石,但如果您使用 C++ 标准库 iostream 操纵器就不是这样:

int main()
{
const std::string inVer = "0x00870016";
uint32_t v = 0;
std::stringstream ss;
ss << inVer;
ss >> std::hex >> v;
const uint16_t major = v >> 16;
const uint16_t minor = v & 0x0000FFFF;
cout << major << "." << minor << "\n";
}

关于c++ - 从奇怪的版本字符串中提取数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18514970/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com