我在互联网上看到了下一个功能:
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号基地...... 买这个功能有用吗?
答案 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());