从奇怪的版本字符串中提取数字
Extracting numbers from weird version string
我有一个应用程序的版本号,该版本号是0x00870016形式,其中前 4 个十六进制数字表示版本号的第一部分,第二个 4 表示第二部分,因此在此示例中,版本号为 135.22。
我试图弄清楚如何(C++(分别提取这些数字以将它们显示为字符串。
通过使用掩码和移位的组合:
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 MSBit 是通过用 0xFFFF0000
屏蔽输入值来的 - 一个数字,其中所有 16 个最重要的数字都设置为 1
,所有最小签名位都0
:
0x00870016 && 0xFFFF0000 = 0x00870000
结果值是您的主版本号,左移 16 位。 因此,让我们将其转移过来:
0x00870000 >> 16 = 0x00000087
在那里,我们有您的真实主版本号。
提取次要版本号类似,只是我们不必移位。
注意:
第一步可以通过跳过掩码来简化:
const uint16_t major = v >> 16;
这是有效的,因为C++标准说,当您向右移动时,腾出的位填充了0
s。 所以最终的程序将是:
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";
}
unsigned version = 0x00870016;
unsigned major = version >> 16;
unsigned minor = version & 0xffff;
printf("Version %u.%un", major, minor);
或
std::cout << "Version " << major << "." << minor << std::endl;
相关文章:
- 如何从适合一定范围的数字中提取数字?
- std::regex:匹配由数字和空格组成的字符串,并提取数字.如何?
- 从迭代器中提取数字
- printf如何从浮点数字中提取数字
- 使用boost::filesystem和boost::lexical_cast从文件名中提取数字
- 在循环中使用字符串流从几个字符串中提取数字
- 从C++字符串中提取数字
- 尝试编写函数尝试从字符串中提取数字,但它返回不相关的数字
- 从C 中的文本提取数字---分割故障
- 如何从C++文件中的特定行中提取数字(浮点数)
- 从字符串中提取数字
- C++ 只从 ostringstream 中提取数字
- C++ 从字符串中提取数字并将其汇总
- 从字符串中提取数字(正则表达式 C++)
- 从输入字符串 C++ 中提取数字
- 如何从 char 数组中提取数字字符串成员
- 从字符串中提取数字/数字范围的复杂算法
- c++如何从带有反斜杠的字符串中提取数字
- 从奇怪的版本字符串中提取数字
- 从字符串c++中提取数字