Chuyển đổi số dương thành số âm trong C #


142

Bạn có thể chuyển đổi một số âm thành tích cực như thế này:

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

Có một phương pháp tương đương để làm cho một số dương âm?



3
280Z28: Tương đương với myInt = -1.
đệ quy

1
phải là myInt | = int.MinValue;
Charles Bretana

@ 280Z28: Điều đó chỉ hoạt động đối với các số lẻ, nếu không, nó cũng giống như làm cho số âm, sau đó trừ đi 1.
Cecil Có một tên

3
Để rõ ràng về mã, tôi không nghĩ bạn nên sử dụng System.Math.Abs ​​() nếu bạn muốn chỉ "chuyển đổi số âm thành số dương". Về mặt toán học, đó không phải là Giá trị tuyệt đối, mặc dù bạn nhận được kết quả mong muốn. Tùy thuộc vào ngữ cảnh thuật toán của bạn, bạn cũng nên sử dụng giải pháp bạn đã chấp nhận dưới đây để chuyển từ tiêu cực sang tích cực.
Chris Dwyer

Câu trả lời:


452

Làm thế nào về

myInt = myInt * -1


55
Giải pháp này rất tốt vì nó cũng có thể chuyển đổi tiêu cực thành tích cực! Thiên tài!
Will Eddins

19
Tôi có ấn tượng rằng bạn chỉ có thể dán một dấu "-" trước bất cứ điều gì để phủ nhận nó ... -myInt Đây sẽ là tiêu cực của giá trị trong myInt ... -ABS (myInt) của bạn sẽ là một tiêu cực rõ ràng.
DataDink

12
những gì về myInt = - Myint?
kokbira

9
hoặc thậm chí ngắn hơn myInt *= - 1?
nawfal

FYI nếu bạn thử phương pháp của kokbira với một đoạn ngắn, myShort = (short) -myShortdiễn viên là cần thiết bởi vì đoạn ngắn trở thành int khi bị phủ định.
AaronLS

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

29
+1 để nhớ rằng nếu đó là một phủ định, bạn sẽ có tác dụng ngược lại. Câu trả lời của bạn là câu duy nhất luôn đưa ra số âm bất kể myNumber là dương hay âm.
David

Chỉ có 26 phiếu cho câu trả lời này? Có người dùng SO nghĩ rằng điều này sẽ không hoạt động?
MusiGenesis

6
30 phiếu bầu? Đã là câu hỏi rất đơn giản. Và câu trả lời quá phức tạp này (-System.Math.Abs ​​(myNumber) cũng sẽ làm) được 30 phiếu bầu ????
mmmmmmmm

4
@rstevens mọi người cùng nhau cố gắng chỉ ra câu trả lời này đúng hơn nhiều so với câu trả lời được chấp nhận. Ngoài ra, - vs * -1 chắc chắn không "quá phức tạp".
Rex M

4
Tôi thích câu trả lời này tốt hơn -System.Math. Có một câu hỏi, vì nó rõ ràng hơn một chút trong nháy mắt những gì đang xảy ra ... Tôi nghĩ rằng sẽ dễ dàng hơn để bỏ lỡ "-" trước tuyên bố.
Beska

132
int negInt = -System.Math.Abs(myInt)

11
Có, bởi vì phủ định là mục tiêu, vì vậy một điểm trừ đơn nguyên là toán tử đúng. Mặt khác, nhân với một phủ định chỉ là một mẹo để phủ nhận một giá trị.
Steven Sudit

38
Đó là một mẹo vì nó dựa vào tác dụng phụ, không phải tác dụng chính. Tác dụng chính của phép trừ đơn phương là phủ định. Tác dụng chính của phép nhân là nhân lên. Nó chỉ xảy ra như vậy nhân với -1 phủ định. Điều đó rõ ràng hơn?
Steven Sudit

5
@StevenSudit Không, không đẹp hơn * -1. Nhân với -1 không phải là "một mánh khóe", đó là cách toán học để biến một số âm. -Số chỉ là một tốc ký của -1 * Số. Ngoài ra, sử dụng abs để giữ số âm là một việc quá mức cần thiết. myInt<0 ? myInt : -myInt;tốt hơn nhiều Chỉ vì toán tử - được cung cấp dưới dạng tốc ký cho Số -1 * thích hợp cộng với khả năng nạp chồng, không biến * (-1) thành một mẹo.
ThunderGr

93

Giống như cách bạn làm bất cứ điều gì tiêu cực khác: đặt một dấu hiệu tiêu cực trước nó.

var positive = 6;
var negative = -positive;

8
Mọi người đều quên đi những điểm trừ đơn phương.
đệ quy

Sự khác biệt thực tế giữa câu trả lời này và câu trả lời này là gì: stackoverflow.com/questions/1348080/ int myNegInt = System.Math.Abs(myNumber) * (-1);
triệt

@ Makerofthings7, một trong những hướng dẫn CPU của bạn có nhiều hướng dẫn CPU hơn - một hoạt động có giá trị tuyệt đối (ít nhất là ba hướng dẫn trên x86), theo sau là MUL (hoặc có thể là NEG nếu trình biên dịch thông minh). Câu trả lời này là một opcode NEG đơn, nhẹ, không có gì nhiều hơn hoặc ít hơn những gì bạn cần. Tất nhiên, hai câu trả lời hành xử khác nhau khi số đầu vào đã âm; nếu (không giống như câu hỏi này) đầu vào của bạn có thể âm tính, điều đó đưa ra quyết định cho bạn.
Joe White

41

Lưu ý cho mọi người đã trả lời

- Math.Abs(myInteger)

hoặc là

0 - Math.Abs(myInteger)

hoặc là

Math.Abs(myInteger) * -1

như một cách để giữ cho số âm âm và biến số dương thành số âm.

Cách tiếp cận này có một lỗ hổng duy nhất. Nó không hoạt động cho tất cả các số nguyên. Phạm vi của Int32loại là từ "-2 31 " đến "2 31 - 1." Nó có nghĩa là có thêm một số "âm". Do đó, Math.Abs(int.MinValue)ném một OverflowException.

Cách chính xác là sử dụng các câu điều kiện:

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

Cách tiếp cận này hoạt động cho "tất cả" số nguyên.


Tôi sẽ đưa ra quan điểm chính xác cho bạn, nhưng bất kỳ mã nào phụ thuộc vào không ai sử dụng abs của MinValue đều dễ vỡ.
Steven Sudit

Steven: Đôi khi, bạn đang giải quyết một vấn đề (như Abs) không thể thực hiện được int.MinValue(giả sử intkiểu trả về.) Trong trường hợp đó, bạn hoàn toàn ổn khi đưa ra một ngoại lệ. Tuy nhiên, vấn đề cụ thể này có kết quả "hợp lệ" int.MinValuenhưng sẽ ném ngoại lệ nếu bạn đi theo Abslộ trình.
Mehrdad Afshari

Sau khi nói rằng thang âm sẽ lớn hơn thang dương, sau đó bạn đi và đề xuất mã không tính đến điều này. Nếu nlà vậy -32768thì -nC -32768!!! NG !!! Hơn nữa, int neg = n < 0 ? n : -n;không thể có thể làm việc trong mọi trường hợp, vì một trong những con chim nhạn hoàn toàn không làm gì cả.
Clive Galway

20

Cách dễ dàng:

myInt *= -1;

1
Sắp đăng bài giống nhau, mọi người nên thể hiện * = một số tình yêu :-)
Brian Scott

16
int negInt = 0 - myInt;

Hoặc đảm bảo là tiêu cực.

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

11

Để chuyển đổi dấu của một số nguyên, bạn chỉ cần sử dụng toán tử dấu:

myInt = -myInt;

Để làm cho nó âm bất kể giá trị ban đầu có âm hay không, trước tiên bạn sử dụng phương thức abs:

myInt = -Math.Abs(myInt);

6

Chỉ để vui hơn:

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);

2
Quá rủi ro, IMHO. Nếu định nghĩa của một vòng tròn thay đổi thì sao?
MusiGenesis

6

EDIT: Điều này là sai đối với các đầu vào tích cực ... Tôi đã sai lầm khi quên rằng phần còn lại của các bit trong -x (giá trị 2s-Bổ sung) là 'đối diện' của giá trị của chúng trong + x, không giống nhau. SO chỉ đơn giản là thay đổi bit dấu sẽ KHÔNG hoạt động đối với các số dương.

Tôi sẽ để nó ở đây cho mục đích ...

Hoặc cách khó khăn (tôi nghĩ) ...

int y = x | ~ int.MaxValue;

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

vì thế

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

và do đó, bất kỳ int32 Or'ed nào sẽ đặt 1 vào bit dấu, (làm cho nó âm) và để tất cả các bit khác giống nhau ...

EDIT: thực sự, vì 1000 0000 0000 0000 0000 0000 0000 0000 thực sự là Minvalue, điều này cũng sẽ hoạt động:

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

Vậy, số 0 âm bằng int.MinValue?
đệ quy

Không, trong bổ sung twos, không có số 0 âm. tất cả những người đều âm 1. A 8Bit đã ký: 10000000 là -128
Charles Bretana

1
+1 vì không ai xứng đáng bị đánh giá thấp khi trả lời một câu hỏi như "lá thư nào đến sau A nhưng trước C?"
MusiGenesis

... và, nhờ câu trả lời của @ Mehrad bên dưới, Đây là cách tiếp cận duy nhất hoạt động khi đầu vào là int.MinValue ...
Charles Bretana

Charles: Điều này sai. Đối với các số âm, nó hoạt động nhưng đối với các số dương, chỉ cần lật bit dấu không thực hiện -number. 1là tất cả số không và một. Hoặc thực hiện với int.MinValuekết quả 10000000000000000000000000000001 không bằng -1(tất cả những cái đó.)
Mehrdad Afshari

6

Mặc dù tôi đến bữa tiệc muộn ở đây, tôi sẽ bắt đầu với một số thủ thuật hữu ích từ những ngày phần cứng của tôi. Tất cả những điều này giả sử đại diện khen ngợi của 2 cho số đã ký.

int negate = ~i+1;
int positiveMagnitude = (i ^ (i>>31)) - (i>>31);
int negativeMagnitude = (i>>31) - (i ^ (i>>31));

Quan tâm để giải thích điều này nhiều hơn? với i == int.MinValue, sau đó tất cả các biến là-2147483648
Clive Galway

5

Chỉ để cho vui:

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

Cập nhật : cái hay của phương pháp này là bạn có thể dễ dàng cấu trúc lại nó thành một trình tạo ngoại lệ:

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

5

tôi sử dụng myInt = -myInt;

Rất đơn giản và dễ dàng

Nếu bạn muốn chỉ có tích cực

myInt = myInt>0 ? myInt : -myInt;

Tôi đã tìm kiếm câu trả lời này trong một tình huống hơi khác với OP. Tôi muốn có 2 giá trị phủ định nhau nếu một trong số chúng là -5 giá trị kia là 5, vì đây là giải pháp tốt nhất của tôi = D
Mathieu Brouwers

bạn sẽ nhận được một tràn kể từ khi int.MaxValue2147483647, thậm chí var i = int.MaxValue; i++;wont work
CMS

4
long negativeNumber = (long)positiveInt - (long)(int.MaxValue + 1);

Không ai nói nó phải là một số âm cụ thể .


Ừm, nếu bạn không quan tâm rằng nó phải là một số âm cụ thể , bạn có thể đơn giản hóa nó thành "long negNumber = -1;"
Beska

@Guffa: thực sự đó là trò đùa ở đây.
MusiGenesis




0

Chuyển đổi một số từ tích cực sang tiêu cực hoặc tiêu cực thành tích cực:

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

0

Chỉ là một cái gì đó mà tôi muốn chia sẻ.

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

1
number >= 0 == isPositive ? number : -number
Vitaliy

0

Như đã đề cập trước đây, chỉ cần nhân với -1 là không hay, như int.MinValue * -1 == int.MinValue

Nó thực sự phụ thuộc vào ứng dụng của bạn, nhưng đối với tôi (Đảo trục điều khiển) tôi muốn đảm bảo rằng tất cả các thái cực vẫn có thể truy cập và duy trì độ trung thực nhất có thể.
Cuối cùng, tôi ánh xạ Max <-> Min và mọi thứ ở giữa được * -1
sử dụng kỹ thuật này, -32767 không thể truy cập được khi đảo ngược.

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


Đam mê 5không phải là -5, nhưng 1/5.
dafie

-2

Sử dụng nhị phân và để loại bỏ bit cuối cùng chịu trách nhiệm cho dấu âm.

Hoặc sử dụng nhị phân hoặc để thêm dấu vào một kiểu dữ liệu.

Soln này nghe có vẻ vô lý và không đầy đủ nhưng tôi có thể đảm bảo đây là phương pháp nhanh nhất.

Nếu bạn không thử nghiệm những gì tôi đã đăng bài viết này có thể trông tào lao: D

Ví dụ cho int:

Int là kiểu dữ liệu 32 bit nên bit cuối cùng (thứ 32) xác định dấu.

Và với giá trị có 0 ở vị trí 32 và phần còn lại 1. Nó sẽ chuyển đổi âm thành no + ve.

Đối với chỉ ngược lại hoặc với một giá trị với 1 ở vị trí thứ 32 và phần còn lại 0.


-3

X=*-1có thể không hoạt động trên tất cả các trình biên dịch ... vì nó đọc một 'bội số' 'SUBTRACT' 1 thay vì NEGECT Các alt tốt hơn là X=(0-X), [WHICH DIFF TỪ X-=X]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.