今回は整数値のビット数から、その値を表現するのに必要になる桁数を求めます。負の値は考慮していませんし、あくまでも数字の桁数ですので符号や3桁ごとのカンマなどは含みません。
桁数は16進数、8進数、10進数について求めます。具体的な理屈については元ネタを参照してください、ここではあくまでも結果だけを掲載するにとどめます。
それでは例によってメタ関数からです。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// 16進数の桁数 template <unsigned N> struct hexadecimal_digits { static const unsigned value = (N + 3) >> 2; }; // 8進数の桁数 template <unsigned N> struct octal_digits { static const unsigned value = (N + 2) / 3; }; // 10進数の桁数 template <unsigned N> struct decimal_digits { static const unsigned value = ((N * 1233) >> 12) + 1; }; |
次に普通の関数を定義してみます。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// 16進数の桁数 unsigned hexadecimal_digits(unsigned n) { return (n + 3) >> 2; } // 8進数の桁数 unsigned octal_digits(unsigned n) { return (n + 2) / 3; } // 10進数の桁数 unsigned decimal_digits(unsigned n) { return ((n * 1233) >> 12) + 1; } |
例によってC++98でもコンパイルできるように書いています。C++11以降であればconstexprを付ければ整数定数式を得られるようになるのでメタ関数は不要になるかと思います。