我有 3 种正整数的基本表示形式:
- 十进制,无符号长变量(例如无符号长整型 NumDec = 200).
- 十六进制,字符串变量(例如字符串 NumHex = "C8")
- 二进制,字符串变量(例如字符串 NumBin = "11001000")
我希望能够以最有效的方式在所有 3 种表示形式的数字之间进行转换。 IE。实现以下6个功能:
unsigned long int Binary2Dec(const string & Bin) {}
unsigned long int Hex2Dec(const string & Hex) {}
string Dec2Hex(unsigned long int Dec) {}
string Binary2Hex(const string & Bin) {}
string Dec2Binary(unsigned long int Dec) {}
string Hex2Binary(const string & Hex) {}
对他们每个人来说最有效的方法是什么?我可以使用 C 和 C++,但不能使用 boost。
编辑:“效率”是指时间效率:最短的执行时间。
正如其他人指出的那样,我会从sscanf() http://en.cppreference.com/w/cpp/io/c/fscanf, printf() http://en.cppreference.com/w/cpp/io/c/fprintf and/or strtoul() http://en.cppreference.com/w/cpp/string/byte/strtoul。它们对于大多数应用程序来说足够快,并且不太可能出现错误。然而,我要说的是,这些函数比您想象的更通用,因为它们必须处理非 ASCII 字符集、以任何基数表示的数字等等。对于某些领域,可以击败库函数。
因此,首先进行测量,如果这些转换的性能确实是一个问题,那么:
1) 在某些应用程序/领域中,某些数字经常出现,例如零、100、200、19.95,可能非常常见,因此优化函数以使用一堆 if() 语句转换这些数字是有意义的,然后回到通用库函数。
2) 如果最常见的 100 个数字,则使用表查找,然后依靠库函数。请记住,大型表可能不适合您的缓存,并且可能需要共享库的多个间接访问,因此请仔细衡量这些内容,以确保不会降低性能。
您可能还想看看 boost lexical_cast 函数,尽管根据我的经验,后者与旧的 C 函数相比是相对而言的。
尽管很多人都说过,但值得一遍又一遍地重复:在有证据表明这些转化是一个问题之前,不要优化这些转化。如果您确实进行了优化,请衡量您的新实施以确保它更快and确保你自己的版本有大量的单元测试,因为你会引入错误:-(
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)