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

时间:2013-08-29 15:23:16

标签: c++

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

我试图找出(在C ++中)我将如何分别提取这些数字以将它们显示为字符串。

2 个答案:

答案 0 :(得分:9)

使用面具和轮班的组合:

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个最不重要的数字。

为了提取主要版本号,让我们发现16个MSBits是通过使用0xFFFF0000屏蔽输入值 - 一个数字,其中所有16个最重要的数字都设置为{{1所有最小sig位都是1

0

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

0x00870016 && 0xFFFF0000 = 0x00870000

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

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

注意:

跳过面具可以简化第一步:

0x00870000 >> 16 = 0x00000087

这是有效的,因为C ++标准说当你向右移动时,腾出的位用const uint16_t major = v >> 16; 填充。所以最终的计划是:

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似乎是一个绊脚石,但如果您使用C ++标准库iostream操纵器则不是这样:

0x

答案 1 :(得分:0)

unsigned version = 0x00870016;
unsigned major = version >> 16;
unsigned minor = version & 0xffff;

printf("Version %u.%u\n", major, minor);

std::cout << "Version " << major << "." << minor << std::endl;