Я хочу реализовать f (int x) {return x == 0? 0: 1; }
в Java.
В C я бы просто « return !! x;
», но !
не работает так в Java. Есть ли способ сделать это без условных операторов? Без чего-то дрянного, вроде развернутой версии
int ret = 0;
for (int i = 0; i < 32; i++) {
ret |= ((x & (1 << i)) >>> i);
}
или
try {
return x/x;
} catch (ArithmeticException e) {
return 0;
}
)
РЕДАКТИРОВАТЬ:
Итак, я провел микробенчмарк трех различных решений:
Тайминги для случайных входов int (весь диапазон int) были:
1. 0.268716
2. 0.324449
3. 0.347852
Да, мое дурацкое решение x / x было быстрее с довольно большим отрывом. Не очень удивительно, если учесть, что в нем очень мало нулей, и в подавляющем большинстве случаев выбирается быстрый путь.
Время для более интересного случая, когда 50% входов равны 0:
1. 1.256533
2. 0.321485
3. 0.348999
наивное x == 0? 0: 1
решение было быстрее примерно на 5%, чем умное (на моей машине). Я попробую разобрать завтра, чтобы узнать почему.
РЕДАКТИРОВАТЬ2: Итак, дизассемблирование для условной версии (без учета бухгалтерского учета):
testl rsi,rsi
setnz rax
movzbl rax,rax
Дизассемблирование для (x | -x) >>> 31:
movl rax,rsi
negl rax
orl rax,rsi
sarl rax,#31
Я не думаю, что нужно говорить что-либо еще.