2011-10-23 42 views
29

Có một hàm Java để chuyển đổi một int tích cực thành một số âm và int âm sang số dương?Chức năng toán học Java để chuyển đổi int dương sang âm và âm sang dương?

Tôi đang tìm kiếm một chức năng reverse để thực hiện chuyển đổi này:

-5 -> 5 
5 -> -5 
+2

liên quan: http://stackoverflow.com/questions/1348080/convert-a-positive-number-to-negative-in-c-sharp và http://stackoverflow.com/questions/5213338/fastest-way-to-flip-the-sign-of-a-double-float-in-c và http://stackoverflow.com/questions/4866187/how-to-flip -the-sign-of-an-số-giá trị-sử dụng-một số-không đổi-và-operator-wit – Shog9

Trả lời

165

gì về x *= -1;? Bạn có thực sự muốn một chức năng thư viện cho việc này không?

+6

@Gandalf Điều này sẽ không chính xác biến 0.0 thành -0.0 ;-) –

+3

@pst Không, không. Ít nhất không phải với JDK 1.6.0_11, D – Gandalf

+7

Đối với tôi câu trả lời sai đã được chấp nhận. Đó là một câu trả lời hợp lệ, nhưng vì OP yêu cầu thay đổi dấu hiệu của một int, do đó không có mối quan tâm về số không âm hoặc các khái niệm khác, tôi đề nghị x = -x là biểu cảm hơn (xem câu trả lời của EJP dưới đây). – drrob

32

Chỉ cần sử dụng unary nhà điều hành trừ:

int x = 5; 
... 
x = -x; // Here's the mystery library function - the single character "-" 

Java có hai trừ operators:

  • quen thuộc số học phiên bản (ví dụ 0 - x), và
  • sự unary trừ hoạt động (được sử dụng tại đây), từ chối toán hạng (đơn)

Điều này biên dịch và hoạt động như mong đợi.

51
x = -x; 

Đây có lẽ là câu hỏi nhỏ nhặt nhất mà tôi từng thấy ở bất cứ đâu.

... và lý do tại sao bạn sẽ gọi chức năng tầm thường này 'reverse()' là một bí ẩn khác.

+2

Điều này không hoạt động trong trường hợp x = Integer.MIN_VALUE và sẽ không hoạt động *. Để an toàn, bạn nên kiểm tra trường hợp này và ném một ngoại lệ hoặc sử dụng hàm thư viện negateExact, thực hiện chính xác điều đó. – rdllopes

+2

@rdllopes Điều tương tự cũng áp dụng cho mọi câu trả lời thực tế ở đây. – EJP

+0

Lưu ý rằng mặc dù nó sẽ không biên dịch nếu x là ngắn hoặc byte, trong khi 'x * = -1' sẽ. Có một chút ngạc nhiên khi tôi phát hiện ra rằng đó là cách tôi đã đi qua trang này :) Tất nhiên bạn có thể đúc, nhưng tôi đã tự động tạo mã nơi x có thể là byte, ngắn, int hoặc dài ... –

7

Một phương pháp (2 của bổ sung):

public int reverse(int x){ 
    x~=x; 
    x++; 
    return x; 
} 

Nó hoạt động của một sự bổ sung đầu tiên (bằng cách bổ sung tất cả các bit) và sau đó thêm 1 vào x. Phương pháp này thực hiện công việc là tốt.

Lưu ý: Phương pháp này được viết bằng Java và sẽ tương tự như nhiều ngôn ngữ khác

+0

Từ 'bổ sung' trong ngữ cảnh này, không phải là 'lời khen'. – EJP

+3

Trong thực tế không làm điều này, chỉ cần làm 'x = -x'. Từ phối cảnh assembly, '-x' là một lệnh' neg' đơn giản trong khi '~ x' và' ++ x' yêu cầu lệnh 'not' và' add'. – Vallentin

1

Necromancing tại đây.
Rõ ràng, x *= -1; quá đơn giản.

Thay vào đó, chúng ta có thể sử dụng một sự bổ sung nhị phân tầm thường:

number = ~(number - 1) ; 

Như thế này:

import java.io.*; 

/* Name of the class has to be "Main" only if the class is public. */ 
class Ideone 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     int iPositive = 15; 
     int iNegative = (~(iPositive - 1)) ; // Use extra brackets when using as C preprocessor directive ! ! !... 
     System.out.println(iNegative); 

     iPositive = ~(iNegative - 1) ; 
     System.out.println(iPositive); 

     iNegative = 0; 
     iPositive = ~(iNegative - 1); 
     System.out.println(iPositive); 


    } 
} 
3

Không có chức năng như vậy tồn tại hoặc có thể viết.

Vấn đề là trường hợp cạnh Integer.MIN_VALUE (-2,147,483,648 = 0x80000000) áp dụng từng phương pháp trong số ba phương pháp trên và bạn nhận được cùng một giá trị. Điều này là do sự biểu diễn của các số nguyên và số nguyên tối đa có thể là Integer.MAX_VALUE (-2,147,483,647 = 0x7fffffff) mà là một ít hơn những gì -Integer.MIN_VALUE nên được.

+7

Nếu bạn muốn mã của mình mạnh mẽ đối với trường hợp góc này, Java 8 cung cấp [Math.negateExact] (http://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#negateExact -int-) sẽ ném một 'ArithmeticException' khi cố gắng loại bỏ MIN_VALUE, thay vì âm thầm trả lại kết quả sai. –

-1

Có, như đã được ghi chú bởi Jeffrey Bosboom (Xin lỗi Jeffrey, tôi đã không nhận thấy bình luận của bạn khi tôi trả lời), có một chức năng như vậy: Math.negateExact.

Không, có thể bạn không nên sử dụng nó. Không, trừ khi bạn cần method reference.

0

Bạn có thể sử dụng toán tử trừ hoặc Math.abs. Những công việc này cho tất cả các số nguyên âm EXCEPT cho Integer.MIN_VALUE! Nếu bạn làm 0 - MIN_VALUE câu trả lời vẫn là MIN_VALUE.

4

gốc * = -1;

Dòng mã đơn giản, ban đầu là bất kỳ nội dung nào bạn muốn.

0

Bạn có thể sử dụng Math:

int x = Math.abs(-5); 
+2

Làm cách nào để biến '5' thành' -5'? – QBrute

+0

Có thể là 'var = Math.abs (var) * -1;' –

Các vấn đề liên quan