纵观互联网,通常会错误地将计数器变量初始化为 0,然后只要计数不等于 0,就进入前置条件循环测试。do-while 循环非常适合避免这种情况。
unsigned udc(unsigned u) //unsigned digit count
{
unsigned c = 0;
do
++c;
while ((u /= 10) != 0);
return c;
}
在u < 10的情况下,测试u是否小于10以避免不必要的除法、增量和 cmp 指令可能更便宜。
但是在优化这个主题上,您可以简单地测试u与10的恒定幂。
unsigned udc(unsigned u) //unsigned digit count
{
if (u < 10) return 1;
if (u < 100) return 2;
if (u < 1000) return 3;
//...
return 0; //number was not supported
}
每个数字可以为您节省3条指令,但是除了不那么吸引人并且手工编写乏味之外,对于不同的基数的适应性较差,在这种情况下,您宁愿编写例程来编写例程,然后再将其插入程序。因为 C 只支持非常有限的数字,64bit,32bit,16bit,8bit,你可以简单地在生成例程时将自己限制在最大值以使所有大小受益。
要考虑负数,如果u < 0在计算位数之前,您只需将u取反即可。 当然首先使例程支持带符号的数字。
如果您知道u < 1000,那么只编写而不是编写例程可能更容易。
if (u > 99) len = 3;
else
if (u > 9) len = 2;
else len = 1;