Передача знака номера на другой номер? - PullRequest
0 голосов
/ 17 января 2019

Я ищу краткий способ взять знак (положительность или отрицательность) числа и перенести его на другое число.

Например:

Нам даны два числа, первое - целое число 1, второе неизвестно до времени выполнения.
Если неизвестное число меньше 0, наше число становится -1.
Если неизвестное число больше или равно 0, наше число становится равным 1.

Если наше неизвестное число X:


enter image description here

как код:

int before = AnyNonzeroInt(); //for this example we will choose 1.
int X = rand(Int32.Min, Int32.Max);
int after = ...

Я лично использую C # 4.5, но я считаю, что хорошее решение было бы довольно независимым от языка.

Я могу придумать несколько способов сделать это, но все они включают операторы if-else-case или троичные операторы. Я хотел бы математический способ сделать это.

редактирует:

У меня нет отвращения к троичным операторам. Тем не менее, кодовая база, над которой я работаю, имеет набор рекомендаций по коду, троичные операторы не допускаются, так как они, как считается, делают код более сложным (я знаю, что знаю. Я не сделал это правило).

Однако я верю, что приму этот вопрос и ответы на него на следующем собрании группы, чтобы показать, насколько необходимо, по моему мнению, троичные операторы.

Ответы [ 3 ]

0 голосов
/ 17 января 2019
var after = (X < 0) ? -1 : 1;

Это дешевле, чем деление, это также яснее в ваших намерениях

0 голосов
/ 17 января 2019

Почему бы и нет:

var after = Math.Sign(x)*before;
0 голосов
/ 17 января 2019
var after = X / Math.Abs(X);

Разделение числа на единицу дает 1, а деление на абсолютное значение гарантирует, что знак не изменится. Обратите внимание, что регистр 0 здесь не обрабатывается (не нужно делить на 0!). Вероятно, для этого понадобится оператор if или троичный символ.

OP отмечает, что в его наборе нет чисел от 0 до -0,01, поэтому добавление небольшого числа, например 0,00001, к X до того, как деление сможет решить проблему 0.

Кроме того, как уже упоминалось в других ответах / комментариях, отвращение к троичному здесь странно. Простое назначение ветки намного дешевле, чем сложение и деление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...