Преобразование X в 1 или 0, если его> 0 или == 0 - PullRequest
1 голос
/ 05 октября 2010

В настоящее время мой алгоритм someValue + x. Я пытаюсь выяснить, как я могу преобразовать x в 1, если оно больше 0, или в 0, если оно равно 0.

Я не хочу использовать if-else для создания этого, а просто преобразовать x в моем алгоритме.

Например: если someValue = 20, x = 4. Это даст 20 + 1 = 21. Но если x = 0. Это просто выдаст 20.

Спасибо.

Ответы [ 10 ]

15 голосов
/ 05 октября 2010

Почему вы хотите сделать это без оператора if, может быть сомнительно, но (начиная с Java 5) Integer имеет метод signum, который будет возвращать -1, 0 или 1 в зависимости от на целочисленное значение:

int newVal = someValue + Integer.signum (x);

Предполагая, что ваше входное значение всегда будет равно нулю или больше, это будет делать то, что вы хотите. Но вряд ли это будет быстрее, чем if оператор вроде:

int newVal = someValue;
if (x > 0) newVal++;

и не более кратко, чем троичная версия:

int newVal = (x > 0) ? someValue + 1 : someValue;

Я просто хотел бы включить его в качестве опции на тот случай, если вам не нужен ни if, ни троичный вариант.

7 голосов
/ 05 октября 2010

Используйте

someValue + (x>0? 1: 0);

Но не беспокойтесь о том, чтобы написать немного, чтобы получить то, что вам нужно. Важно написать понятный код:)

3 голосов
/ 05 октября 2010

Его простая операция, вы можете просто использовать это

 n + (x>0? 1 : 0);
2 голосов
/ 11 октября 2010

Если x неотрицательное целое число:

return someValue + (x + 2)%(x + 1);
2 голосов
/ 05 октября 2010

Использование someValue + (x> 0)? 1: 0 в лучшем случае должно быть эквивалентно:

if (x> 0) someValue ++;

при компиляции, поэтому ветвления не избежать. Если вам по какой-то причине необходимо избегать ветвления, вы можете использовать:

х = - ((~ (х-1) | х) >> 31);

В качестве бонуса для языка C это будет:

х = (~ (х-1) | х) >> (SizeOf (х) * CHAR_BIT-1)

Результат равен 0, если x == 0, 1 в противном случае. Это чисто побитовые операции, без веток и всего 5 целочисленных операций. Для подобных трюков (хотя этого нет в списке, я просто изменил другой алгоритм), вы можете увидеть эту страницу с хитрыми хитрыми хитростями:

2 голосов
/ 05 октября 2010

Предполагая, что x всегда будет >=0, вы можете сделать:

x = (x > 0) ? 1 : 0;
1 голос
/ 05 октября 2010
x=-((~(x-1)|x)>>31);

по моему мнению, это лучший ответ. Но сначала вы должны сохранить X в 32-битном типе данных. например int (x86).
Нет филиалов, нет суждения

1 голос
/ 05 октября 2010

Для удобства чтения определите дополнительный метод для условной части:

 public static int absoluteSignum(int x) {
   return x == 0 ? 0 : 1;
 }

и используйте его в своем коде:

 int result = someValue + absluteSignum(x);
1 голос
/ 05 октября 2010

возврат х> 0? someValue + 1: someValue;

но это все равно заканчивается условным утверждением. Вы просто не делаете это явно.

0 голосов
/ 05 октября 2010

Просто добавить что-то еще в микс, который мог бы работать (но не обязательно разумный способ сделать это) ...

int value = 0;
try {
    value = x / x;
}
catch (Exception e) { }
return someValue + value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...