在C/C++中有效地转换Hex,Binary和Decimal

Igo*_*Oks 9 c c++ binary hex decimal

我有正整数的3个基本表示:

  1. 十进制,无符号长变量(例如unsigned long int NumDec = 200).
  2. 十六进制,字符串变量(例如字符串NumHex ="C8")
  3. 二进制,字符串变量(例如字符串NumBin ="11001000")

我希望能够以最有效的方式在所有3个表示中的数字之间进行转换.即实现以下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) {}
Run Code Online (Sandbox Code Playgroud)

每种方法最有效的方法是什么?我可以使用C和C++,但不能提升.

编辑:"效率"是指时间效率:最短的执行时间.

cor*_*yan 8

正如其他人所指出的那样,我会开始sscanf(),printf()和/或strtoul().它们对于大多数应用程序来说足够快,并且它们不太可能有bug.但是,我会说,这些函数比你想象的更通用,因为它们必须处理非ASCII字符集,数字表示在任何基数等等.对于某些域,可以击败库函数.

因此,首先测量,如果这些转换的性能确实是一个问题,那么:

1)在某些应用程序/域中,某些数字经常出现,例如零,100,200,19.95,可能是如此常见以至于优化函数以使用一堆if()语句转换这些数字是有意义的,然后回到通用库函数.2)如果最常见的100个数字使用表查找,然后回退到库函数.请记住,大型表可能不适合您的缓存,并且可能需要多个共享库的间接性,因此请仔细测量这些内容以确保不降低性能.

您可能还想查看boost lexical_cast函数,但根据我的经验,后者与较好的旧C函数相比较.

很多人都说过,它值得一遍又一遍地重复:在你有证据证明它们存在问题之前,不要优化这些转换.如果你做了优化,测量你的新实现,以确保它更快,并确保你有自己的版本的大量单元测试,因为你将引入错误:-(