У меня есть код, который делает много сравнений с 64-битными целыми числами, однако он должен учитывать длину числа, как если бы он был отформатирован как строка. Я не могу изменить код вызова, только функцию.Самый быстрый способ вычисления десятичной длины целого числа? (.NET)
Самый простой способ (кроме того. .ToString() Length) является:
(int)Math.Truncate(Math.Log10(x)) + 1;
Однако это выполняет весьма слабо. Так как мое приложение отправляет только положительные значения, а длины достаточно равномерно распределены между 2 и 9 (с некоторым уклоном в сторону 9), я предварительно вычислены значения и имеют ли заявления:
static int getLen(long x) {
if (x < 1000000) {
if (x < 100) return 2;
if (x < 1000) return 3;
if (x < 10000) return 4;
if (x < 100000) return 5;
return 6;
} else {
if (x < 10000000) return 7;
if (x < 100000000) return 8;
if (x < 1000000000) return 9;
return (int)Math.Truncate(Math.Log10(x)) + 1; // Very uncommon
}
}
Это позволяет длина вычисляется с в среднем 4 сравнения.
Итак, есть ли другие трюки, которые я могу использовать для ускорения этой функции?
Редактировать: Это будет работать как 32-разрядный код (Silverlight).
Update:
Я принял предложение Нормана и изменил сослагательное наклонение вокруг немного, чтобы привести в среднем только 3 сравнивает. Согласно комментарию Шона, я удалил Math.Truncate. Вместе это увеличило примерно 10%. Благодаря!
Я подозреваю, что это близко к оптимальному. Мне будет интересно увидеть любые ответы, хотя: -p –
Вы можете немного упростить возврат, чтобы быть «return 1 + (int) Math.Log10 (x)» Я считаю, –
О, хорошо, спасибо Шон. – MichaelGG