我正在学习C,我不知道其中一个K&R练习,清单:
练习2-3,编写函数
htoi(s),它将十六进制数字字符串(包括可选的0x或0X)转换为等效的整数值。允许的数字是0通过9,a通过f,A通过F。
我想我需要在这里做一些递归,我只是猜我对编号类型和它们的各种转换方法不太了解,等等。
有人能给我一些关于如何最好地理解它的建议吗?我不是在找人牵着我的手,而是引导我找到一种正确理解的方法,这样我就可以尽可能地用最优雅的形式来写这篇文章,而不是用printf("%x", skill);。
发布于 2009-04-25 01:27:28
递归是不必要的。您只需在字符串上向后循环(即从units列开始),将单数转换时间之和为基数位置乘数。这是伪代码,不处理可选的0x前缀(也不检查溢出的可能性):
long total = 0;
long multiplier = 1;
for (int i = string.length - 1; i >= 0 i--)
{
digit = ConvertSingleHexDigittoInt(string[i]);
total += digit * multiplier;
multiplier *= 16;
}我把ConvertSingleHexDigittoInt()的简单实现留给了您:)
发布于 2009-04-25 02:14:11
从左到右处理字符串对那些熟悉数学的人来说更加简单和可读性更强。策略是认识到,例如,1234 = (((1 x 10) + 2) x 10 + 3) x 10 + 4
换句话说,当你从左到右处理每一个数字的时候,把前一个数字乘以基,有效地“向左移动”一个位置,然后添加新的数字。
long decFromHexStr(const char *hexStr)
{
int i;
long decResult = 0; // Decimal result
for (i=0; i < strlen(hexStr); ++i)
{
decResult = 16 * decResult + decFromHexChar(hexStr[i]);
}
return decResult;
}经验丰富的程序员可能会使用指针来遍历字符串,而不是将其视为数组:
long decFromHexStr(const char *pHex)
{
long decResult = 0;
while (*pHex != '\0')
{
decResult = 16 * decResult + decFromHexChar(*pHex++);
}
return decResult;
}既然你正在学习,就值得学习编码风格,并决定它是否有用,所以你会尽早养成良好的习惯。
玩得开心!
发布于 2009-04-25 02:32:59
十六进制数到底是什么意思?让我们来看看15‘s。这意味着
1 * 16^3 + 5 * 16^2 + 15 * 16^1 + 10 * 16^0注意,A表示10,B 11等等,直到表示15的F。也是16^0等于1。
因此,我们所需要做的就是计算上面表达式的值!最简单的方法可能是按以下顺序进行:
10 * 1
15 * 16
5 * 256 //256 = 16 * 16
1 * 4096 //4096 = 16 * 16 * 16如果有更多的数字,这种情况还可以继续下去。你真正需要的是一个循环和几个变量。
还有另一种方法可以通过分解上述表达式来解释,如下所示:
((1 * 16 + 5) * 16 + 15) * 16 + 10如果您愿意,可以尝试以下每一种方法。
更高级信息:
基本上,计算机使用基2(也称为二进制)来进行所有的数字和计算。甚至字符串"1A6DC0“也用1s和0编码,最终以字母和数字的形式显示在屏幕上。
有时你可以利用计算机使用二进制的事实,但通常你不需要考虑这个问题。
例如,当你
x = (11 + y) * 6;你不需要担心在某个阶段11和6会被表示成一系列的高电压和低电压。就像你期望的那样。从十进制(我们使用的数字系统)到二进制和后退之间的转换是一个简单的过程,计算机可以很容易地做到这一点,所以他们会自动地为我们做这件事,以使我们的工作更容易。
但是,在十六进制和二进制之间进行转换时,有一个快捷方式。由于四个二进制数字与单个十六进制数字相同,所以您可以将每个十六进制数字单独转换为二进制数字,然后将它们串在一起。
例如,15 For 会像这样展开:
1 -> 0001
5 -> 0101
F -> 1111
A -> 1010
15FA -> 0001 0101 1111 1010请注意,这通常不能直接完成,通常涉及逻辑或位移位(|和<<)。有趣的东西。
https://stackoverflow.com/questions/788026
复制相似问题