インターネットを見渡すと、カウンター変数を 0 に初期化してから、カウントが 0 に等しくない限り事前条件ループ テストに入るという間違いを犯すことがよくあります。do-while ループはこれを回避するのに最適です。
unsigned udc(unsigned u) //unsigned digit count
{
unsigned c = 0;
do
++c;
while ((u /= 10) != 0);
return c;
}
u < 10の場合に不必要な除算、インクリメント、および cmp 命令を避けるために、uが10未満であるかどうかをテストする方がおそらく安価です。
しかし、その主題である最適化については、 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;