Есть два метода, о которых я читал, делить на 10 раз (или немного эффективнее, делить так, чтобы минимизировать операции деления), т.е.
int getFirstDigit(unsigned int num) {
if (num >= 100000000)
num /= 100000000;
if (num >= 10000)
num /= 10000;
if (num >= 100)
num /= 100;
if (num >= 10)
num /= 10;
return num;
}
Кредит: Как эффективно извлечь первую десятичную цифру числа
С беззнаковым int это будет делить самое большее в 3 раза, сокращая операции деления, которые, насколько я знаю, самые дорогие операции сборки. Мой вопрос: как это сравнить со следующей строковой операцией:
int getFirstDigit(unsigned int num) {
return (to_string(num))[0] - '0';
}
Он преобразуется в строку, получает символ и смещается на 48, чтобы получить чистое число, которое символ будет представлять. Я знаю, что строки связаны с огромным количеством накладных расходов, и я немного осмотрелся, но не смог найти конкретного ответа, сравнивая их.
Запоздалая мысль: я увидел журнал на странице, которую я зачислил ранее, и, полагаю, я мог бы взять базу логарифмов 10 числа, собрать результат в полях, чтобы увидеть, с каким порядком 10 он связан снизу, и использовать это число как показатель степени 10, где они делят число, на которое я смотрю, сводя его к операции логарифмирования, операции питания и операции деления. Если это даже уменьшит это. Но опять же, я понятия не имею, относительное время выполнения.
Извините, я действительно видел много похожих вопросов, но ни один из тех, которые я чувствовал, не ответил на мой конкретный вопрос об относительном времени выполнения, основанном на эффективности на уровне сборки. Моя интуиция говорит мне, что деление намного лучше, чем строка, но я не уверен, потому что строка - это просто непрерывные значения ascii в памяти.