Преобразовать положительное число в отрицательное в C#



вы можете преобразовать отрицательное число в положительное, как это:



int myInt = System.Math.Abs(-5);


есть ли эквивалентный метод, чтобы сделать положительное число отрицательным?

5636   23  
c#

23 ответов:

как о

myInt = myInt * -1

int myNegInt = System.Math.Abs(myNumber) * (-1);
int negInt = -System.Math.Abs(myInt)

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

var positive = 6;
var negative = -positive;

Примечание для всех, кто ответил с

- Math.Abs(myInteger)

или

0 - Math.Abs(myInteger)

или

Math.Abs(myInteger) * -1

как способ сохранить отрицательные числа отрицательными и превратить положительные отрицательные.

этот подход имеет один недостаток. Это не работает для всех чисел. Диапазон Int32 тип от "-231" в "231 - 1.- Это значит, что есть еще одно "отрицательное" число. Следовательно, Math.Abs(int.MinValue) выдает OverflowException.

в правильный способ - использовать условные операторы:

int neg = n < 0 ? n : -n;

этот подход работает для "всех" чисел.

самый простой способ:

myInt *= -1;
int negInt = 0 - myInt;

или гарантированно будет отрицательным.

int negInt = -System.Math.Abs(someInt);

чтобы переключить знак целого числа, вы просто используете оператор знака:

myInt = -myInt;

чтобы сделать его отрицательным независимо от того, является ли исходное значение отрицательным или нет, вы сначала используете метод Abs:

myInt = -Math.Abs(myInt);

EDIT: это неправильно для положительных входов... Я сделал ошибку, забыв, что остальные биты в-x (2S-Complement value) являются "противоположными" их значению в +x, а не одинаковыми. Поэтому простое изменение знакового бита не будет работать для положительных чисел.

Я оставлю это здесь Для в целях...

или хитрый способ ( я думаю )...

int y = x / ~int.Максвеллову;

cause int.MaxValue is 0111 1111 1111 1111 1111 1111 1111 1111

так

~int.MaxValue is      1000 0000 0000 0000 0000 0000 0000 0000

и поэтому любой int32 Or'ED с этим поставит 1 в знаковый бит (что делает его отрицательным) и оставит все остальные биты одинаковыми...

изменить: на самом деле, так как 1000 0000 0000 0000 0000 0000 0000 на самом деле является Minvalue, это также должно работать:

   int y = x | int.MinValue; // or, to do it to itself,
   x |= int.MinValue;

просто для удовольствия:

int myInt = Math.Min(hisInt, -hisInt);

int myInt = -(int)Math.Sqrt(Math.Pow(Math.Sin(1), 2) + Math.Pow(Math.Cos(-1), 2))
            * Math.Abs(hisInt);

просто для удовольствия:

int negativeInt = int.Parse(String.Format("{0}{1}", 
    "-", positiveInt.ToString()));

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

int negativeInt = int.Parse(String.Format("{0}{1}", 
    "thisisthedumbestquestioninstackoverflowhistory", positiveInt.ToString()));

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

int negate = ~i+1;
int positiveMagnitude = (i ^ (i>>31)) - (i>>31);
int negativeMagnitude = (i>>31) - (i ^ (i>>31));
long negativeNumber = (long)positiveInt - (long)(int.MaxValue + 1);

никто не сказал, что это должен быть любой особенности отрицательное число.

может это?

int n;

.... some coding....

n = n<=0? n:0-n;
int myInt = - System.Math.Abs(-5);

Я использую myInt = -myInt;

Так Просто и легко

Если вы хотите иметь только положительные

myInt = myInt>0 ? myInt : -myInt;

умножьте его на -1.

более простой способ а = - а сделает одолжение

преобразование числа из положительного в отрицательное или из отрицательного в положительное:

public static decimal Reverse(this decimal source)
{
     return source * decimal.MinusOne;
}

просто то, что я хочу поделиться.

public decimal NumberReevaluate(decimal number, bool isPositive)
{
    var tempNumber = System.Math.Abs(number);
    return isPositive ? tempNumber : -tempNumber;
}

как уже упоминалось ранее, просто умножение на -1 не круто, как int.MinValue * -1 == int.MinValue

это действительно зависит от вашего приложения, но для моего (Инвертирование осей джойстика) я хочу убедиться, что все крайности по-прежнему доступны и поддерживают как можно большую точность.
С этой целью я сопоставляю Max Min и все между ними получает a * -1
Используя этот метод, -32767 недостижимо при инвертировании.

private static int Invert(int value) { if (value == int.MaxValue) return int.MinValue; if (value == int.MinValue) return int.MaxValue; return value * -1; }

X=*-1 может работать не на всех компиляторах... поскольку он читает "умножить ""вычесть" 1 вместо отрицательного Чем лучше alt X=(0-X), [ЧТО ОТЛИЧАЕТСЯ ОТ X-=X]

используйте двоичный и удалить последний бит, который отвечает за отрицательный знак.

или использовать двоичный код или добавить знак к типу данных.

Это soln может показаться абсурдным и неполным, но я могу гарантировать, что это самый быстрый метод.

Если вы не экспериментируете с тем, что я опубликовал, этот пост может выглядеть дерьмово :D

например, для int:

Int-это 32-битный тип данных, поэтому последний бит (32-й) определяет знак.

и со значением который имеет 0 в 32 месте и остальные 1. Он будет преобразовывать отрицательные не положительные.

для прямо противоположного или со значением с 1 на 32-м месте и отдыха 0.

Comments

    Ничего не найдено.