Если вы хотите сравнить число с обратным, может быть быстрее изменить число, используя деление, чем преобразовывать его в строку. Мне все еще нужно проверить скорость.
private static int Reverse(int num) {
int res = 0;
while (num > 0) {
int rm ;
num = Math.DivRem(num, 10, out rm);
res = res * 10 + rm;
}
return res;
}
EDIT:
DivRem был примерно на 1% быстрее, чем деление и модуль в моем компьютере.
Оптимизация скорости - выход, если последняя цифра 0:
private static int Reverse(int num) {
int res = 0;
int rm;
num = Math.DivRem(num, 10, out rm);
//Some magic value or return false, see below.
if (rm == 0) return -1 ;
res = res * 10 + rm;
while (num > 0) {
num = Math.DivRem(num, 10, out rm);
res = res * 10 + rm;
}
return res ;
}
Заставить метод возвращать bool было немного медленнее, чем сравнивать bool в цикле на моем компьютере, но я не понимаю почему. Пожалуйста, проверьте на вашем компьютере.
Умножение и сдвиг битов должны выполняться быстрее деления, но, вероятно, они недостаточно точны. РЕДАКТИРОВАТЬ: использование долго кажется достаточно точным.
private static int FastReverse(int num) {
int res = 0;
int q = (int)((214748365L * num) >> 31);
int rm = num - 10 * q;
num = q;
if (rm == 0) return -1;
res = res * 10 + rm;
while (num > 0) {
q = (int)((214748365L * num) >> 31);
rm = num - 10 * q;
num = q;
res = res * 10 + rm;
}
return res;
}
(214748365L * num) >> 31 равно i / 10 до 1 073 741 829, где 1/10 дает 107374182, а умножение + двоичное смещение дает 107374183.