f (int x) {return x == 0? 0: 1; } на Java без условных операторов

Я хочу реализовать 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;
}

)

РЕДАКТИРОВАТЬ:

Итак, я провел микробенчмарк трех различных решений:

  1. мое решение для возврата x / x,
  2. очевидное решение x == 0? 0: 1 и
  3. решение Эда Стауба: (x | -x) >>> 31.

Тайминги для случайных входов 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

Я не думаю, что нужно говорить что-либо еще.

31
задан Zero Piraeus 23 January 2015 в 17:24
поделиться