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?
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?
Câu trả lời:
Làm thế nào về
myInt = myInt * -1
myInt = - Myint
?
myInt *= - 1
?
myShort = (short) -myShort
diễn viên là cần thiết bởi vì đoạn ngắn trở thành int khi bị phủ định.
int myNegInt = System.Math.Abs(myNumber) * (-1);
int negInt = -System.Math.Abs(myInt)
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.
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;
int myNegInt = System.Math.Abs(myNumber) * (-1);
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 Int32
loạ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.
Abs
) không thể thực hiện được int.MinValue
(giả sử int
kiể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.MinValue
nhưng sẽ ném ngoại lệ nếu bạn đi theo Abs
lộ trình.
n
là vậy -32768
thì -n
C -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ả.
Cách dễ dàng:
myInt *= -1;
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);
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;
-number
. 1
là tất cả số không và một. Hoặc thực hiện với int.MinValue
kết quả 10000000000000000000000000000001 không bằng -1
(tất cả những cái đó.)
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));
i == int.MinValue
, sau đó tất cả các biến là-2147483648
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()));
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;
int.MaxValue
là 2147483647
, thậm chí var i = int.MaxValue; i++;
wont work
long negativeNumber = (long)positiveInt - (long)(int.MaxValue + 1);
Không ai nói nó phải là một số âm cụ thể .
Có lẽ điều này?
int n;
.... some coding....
n = n<=0? n:0-n;
Nhân nó với -1.
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;
}
5
không phải là -5
, nhưng 1/5
.
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.
X=*-1
có 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
]