Я хочу реализовать 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;
}
)
РЕДАКТИРОВАТЬ:
Итак,Я сделал микробенчмарк из трех разных решений:
- моего решения x / x catch для возврата,
- очевидного решения x == 0? 0: 1 и
Время для случайных входов int (всего диапазона int) было:
1. 0.268716
2. 0.324449
3. 0.347852
Да,мое дурацкое х / х решение было быстрее с довольно большим запасом.Не очень удивительно, если учесть, что в нем очень мало нулей, и в подавляющем большинстве случаев используется быстрый путь.
Время для более интересного случая, когда 50% входных данных равно 0:
1. 1.256533
2. 0.321485
3. 0.348999
Наивное решение x==0?0:1
оказалось на 5% быстрее, чем умное (на моей машине).Завтра я попытаюсь выполнить некоторую разборку, чтобы выяснить, почему.
EDIT2: Хорошо, поэтому разборка для условной версии (исключая бухгалтерию):
testl rsi,rsi
setnz rax
movzbl rax,rax
Разборка для (x | -x) >>> 31:
movl rax,rsi
negl rax
orl rax,rsi
sarl rax,#31
Я не думаю, что нужно что-то еще сказать.