Мне нужно проверить, много ли целых чисел на одной стороне нуля. Меня не волнует, что это положительный или отрицательный, просто что это одна и та же сторона... и производительность очень важна.
В настоящее время я делаю это:
if (int1 == 0 || int2 == 0) {
// handle zero
} else if ((int1 ^ int2) > 0) {
// different side
} else {
// same side
}
Это 30% -ное улучшение скорости (проверено с caliper) более очевидным:
if ((int1 > 0 && int2 > 0) || (int1 < 0 && int2 < 0)) {
Можно ли сделать это быстрее?
ПРИМЕЧАНИЕ.. Все эти решения проверяют первый бит, в основном, который для нуля совпадает с положительным числом. Поэтому, если это работает для вашего приложения, вам не нужно делать нулевую проверку.
Список контрольных показателей:
- XOR: Оригинальный ответ с исправлением ошибки
- Ifs: Очевидное решение
((&&)||(&&))
- Биты: @hatchet solution
(>>31) == (>>31)
- BitAndXor: решение @greedybuddha
(0x80000000)
- BitAndEquals: решение @greedybuddha изменено для использования
==
not^
- XorShift: решение @aaronman
(^)>>31 == 0
Выход суппорта:
0% Scenario{vm=java, trial=0, benchmark=XOR} 1372.83 ns; ?=7.16 ns @ 3 trials
17% Scenario{vm=java, trial=0, benchmark=Ifs} 2397.32 ns; ?=16.81 ns @ 3 trials
33% Scenario{vm=java, trial=0, benchmark=Bits} 1311.75 ns; ?=3.04 ns @ 3 trials
50% Scenario{vm=java, trial=0, benchmark=XorShift} 1231.24 ns; ?=12.11 ns @ 5 trials
67% Scenario{vm=java, trial=0, benchmark=BitAndXor} 1446.60 ns; ?=2.28 ns @ 3 trials
83% Scenario{vm=java, trial=0, benchmark=BitAndEquals} 1492.37 ns; ?=14.62 ns @ 3 trials
benchmark us linear runtime
XOR 1.37 =================
Ifs 2.40 ==============================
Bits 1.31 ================
XorShift 1.23 ===============
BitAndXor 1.45 ==================
BitAndEquals 1.49 ==================
vm: java
trial: 0
Похоже, @aaronman - победитель