这个基本转换函数背后的逻辑是什么?

时间:2017-02-11 22:54:54

标签: c++

我在互联网上看到了下一个功能:

std::string hexify(unsigned int n)
{
    std::string res;

    do
    {
        std::cout << n <<std::endl;
        res += "0123456789ABCDEF"[n % 16];
        n >>= 4;
    } while (n);

    return std::string(res.rbegin(), res.rend());
}

此函数将整数转换为hexa。 我试图理解这背后的逻辑,但没有成功......

我明白什么是16号基地和10号基地...... 买这个功能有用吗?

3 个答案:

答案 0 :(得分:3)

该行:

res += "0123456789ABCDEF"[n % 16];

只是添加到char末尾的"0123456789ABCDEF"的下半字节索引的n数组std::string res

然后:

n >>= 4;

n右移半个字节;

然后:

} while (n);

n中的所有半字节都被消耗时,

结束循环。

最后:

return std::string(res.rbegin(), res.rend());

返回反向转换!

所以,例如:

hexify(0x56AB9);

返回std::string

"56AB9"

这可以简化为:

res = "0123456789ABCDEF"[n % 16] + res;  // instead of res += "0123456789ABCDEF"[n % 16];

然后简单地说:

return res;  // instead of return std::string(res.rbegin(), res.rend());

答案 1 :(得分:1)

n%16得到n的低4位。 "0123456789ABCDEF"是一个包含这些字符的数组。 "0123456789ABCDEF"[n%16]索引到数组中;结果是数组中对应于n%16的字符,即这4位的十六进制值。 n >>= 4;n的值向左移4位,删除已经编码的4位,因此循环可以获得接下来的4位。但这会使十六进制字符按相反的顺序排列,左边的低字和右边的高字,所以最后一行创建一个新的`std :: strings对象,计算出的字符串被反转。

答案 2 :(得分:0)

我认为到目前为止这个问题已得到很好的解释,但我想在有人不知道的情况下添加一些内容。

首先是字符串&#34; 0123456789ABCDEF&#34;它被编译器视为const char [17](包括null字符)。这意味着我们可以使用括号运算符[]对其进行索引。然后,如果我们有&#34; 0123456789ABCDEF&#34; [15]对应于单个字符&#39; F&#39;。

因为我们将值n修改为16.我们的索引值在0到15之间变化,具体取决于n的最后4位。 N%16只是掩盖n的一种方式。

因为十六进制值中的每个字符由4位组成,所以循环移动n>&gt; 4.二进制表示中的值在0000到1111或(0-F)之间变化。

另一个需要注意的重要事项是,因为值n是无符号的,所以右移位运算符将移位(在这种情况下为4位),并用0填充最左边的值。因此,我们将能够终止我们的循环&#34;而(n)&#34;当n达到0时。

根据建议添加另一个事实,该函数正在查看最右边的位,并且每次使用&#34; + =&#34;在res字符串的末尾添加它们。运营商。这就是为什么结果会向后创建一个字符串。     return std :: string(res.rbegin(),res.rend());