Toán tử ^ làm gì trong Java?


294

^Toán tử (caret) phục vụ chức năng nào trong Java?

Khi tôi thử điều này:

int a = 5^n;

...nó đưa cho tôi:

cho n = 5, trả về 0
cho n = 4, trả về 1
cho n = 6, trả về 3

... Vì vậy, tôi đoán nó không thực hiện lũy thừa. Nhưng sau đó là gì?


5
Bạn có thể gửi mã thực tế bạn đang sử dụng?
Anthony Forloney

Tôi đang sử dụng nhật thực và điều này trả về 11. lớp công khai SimpleParser {public static void main (String [] args) {System.out.println ((10 ^ 1)); }}

2
Trong Java, ^toán tử không có nghĩa là cho tập hợp sức mạnh. Bạn sẽ cần Math.powthay thế. Xem câu trả lời của đa gen.
Anthony Forloney

@WizardOfOdds: đồng ý, đây là một câu hỏi hay ( ^đối với lũy thừa? Đó chỉ là lẽ thường!). Việc khám phá ngôn ngữ Java của OP cần được khuyến khích.
đa gen

Câu trả lời:


419

Toán tử ^ trong Java

^ trong Java là toán tử độc quyền hoặc ("xor").

Hãy lấy 5^6ví dụ:

(decimal)    (binary)
     5     =  101
     6     =  110
------------------ xor
     3     =  011

Đây là bảng chân lý cho bitwise ( JLS 15.22.1 ) và logic ( JLS 15.22.2 ):

^ | 0 1      ^ | F T
--+-----     --+-----
0 | 0 1      F | F T
1 | 1 0      T | T F

Đơn giản hơn, bạn cũng có thể nghĩ về xor là "cái này hay cái kia, nhưng không phải cả hai !".

Xem thêm


Số mũ trong Java

Đối với lũy thừa số nguyên, thật không may, Java không có toán tử như vậy. Bạn có thể sử dụng double Math.pow(double, double)(truyền kết quả tớiint nếu cần thiết).

Bạn cũng có thể sử dụng thủ thuật dịch chuyển bit truyền thống để tính toán một số quyền hạn của hai. Đó là, (1L << k)là hai đến sức mạnh thứ k cho k=0..63.

Xem thêm


Hợp nhất lưu ý : câu trả lời này đã được hợp nhất từ ​​một câu hỏi khác trong đó ý định sử dụng lũy ​​thừa để chuyển đổi một chuỗi"8675309"thànhintmà không sử dụngInteger.parseIntnhư một bài tập lập trình (^biểu thị từ lũy thừa từ bây giờ). Ý định của OP là tính toán8*10^6 + 6*10^5 + 7*10^4 + 5*10^3 + 3*10^2 + 0*10^1 + 9*10^0 = 8675309; phần tiếp theo của câu trả lời này giải quyết vấn đề lũy thừa là không cần thiết cho nhiệm vụ này.

Đề án của H Corner

Giải quyết nhu cầu cụ thể của bạn , bạn thực sự không cần phải tính toán các sức mạnh khác nhau của 10. Bạn có thể sử dụng cái được gọi là sơ đồ của Horner , không chỉ đơn giản mà còn hiệu quả.

Vì bạn đang làm điều này như một bài tập cá nhân, tôi sẽ không cung cấp mã Java, nhưng đây là ý tưởng chính:

8675309 = 8*10^6 + 6*10^5 + 7*10^4 + 5*10^3 + 3*10^2 + 0*10^1 + 9*10^0
        = (((((8*10 + 6)*10 + 7)*10 + 5)*10 + 3)*10 + 0)*10 + 9

Thoạt nhìn có vẻ phức tạp, nhưng thực sự không phải vậy. Về cơ bản, bạn đọc các chữ số từ trái sang phải và bạn nhân kết quả của mình cho đến 10 trước khi thêm chữ số tiếp theo.

Ở dạng bảng:

step   result  digit  result*10+digit
   1   init=0      8                8
   2        8      6               86
   3       86      7              867
   4      867      5             8675
   5     8675      3            86753
   6    86753      0           867530
   7   867530      9          8675309=final

16
chỉ cần thêm vào câu trả lời này, chức năng mà OP đang tìm kiếm có lẽ là Math.pow (10, 1)
tjohns20

146

Như nhiều người đã chỉ ra, đó là toán tử XOR . Nhiều người cũng đã chỉ ra rằng nếu bạn muốn lũy thừa thì bạn cần sử dụng Math.pow .

Nhưng tôi nghĩ cũng hữu ích khi lưu ý rằng đó ^chỉ là một trong một nhóm các toán tử được gọi chung là các toán tử bitwise:

Operator    Name         Example     Result  Description
a & b       and          3 & 5       1       1 if both bits are 1.
a | b       or           3 | 5       7       1 if either bit is 1.
a ^ b       xor          3 ^ 5       6       1 if both bits are different.
~a          not          ~3          -4      Inverts the bits.
n << p      left shift   3 << 2      12      Shifts the bits of n left p positions. Zero bits are shifted into the low-order positions.
n >> p      right shift  5 >> 2      1       Shifts the bits of n right p positions. If n is a 2's complement signed number, the sign bit is shifted into the high-order positions.
n >>> p     right shift  -4 >>> 28   15      Shifts the bits of n right p positions. Zeros are shifted into the high-order positions.

Từ đây .

Các toán tử này có thể có ích khi bạn cần đọc và ghi vào các số nguyên trong đó các bit riêng lẻ nên được hiểu là cờ hoặc khi một phạm vi bit cụ thể trong một số nguyên có ý nghĩa đặc biệt và bạn chỉ muốn trích xuất các số đó. Bạn có thể thực hiện rất nhiều chương trình mỗi ngày mà không cần phải sử dụng các toán tử này, nhưng nếu bạn phải làm việc với dữ liệu ở cấp độ bit, một kiến ​​thức tốt về các toán tử này là vô giá.


34

Đó là XOR bitwise, Java không có toán tử lũy thừa, Math.pow()thay vào đó bạn sẽ phải sử dụng .


20

Quy tắc toán tử XOR =>

0 ^ 0 = 0
1 ^ 1 = 0
0 ^ 1 = 1
1 ^ 0 = 1

Đại diện nhị phân của 4, 5 và 6:

4 = 1 0 0 
5 = 1 0 1
6 = 1 1 0

bây giờ, thực hiện thao tác XOR trên 5 và 4:

     5 ^ 4 => 1  0  1   (5)
              1  0  0   (4)
            ----------
              0  0  1   => 1

Tương tự như vậy,

5 ^ 5 => 1   0   1    (5)
         1   0   1    (5)
       ------------
         0   0   0   => (0)


5 ^ 6 => 1   0   1  (5)
         1   1   0  (6)
        -----------
         0   1   1  => 3


15

Rất nhiều người đã giải thích về nó là gì và làm thế nào nó có thể được sử dụng nhưng ngoài điều hiển nhiên bạn có thể sử dụng toán tử này để thực hiện nhiều thủ thuật lập trình như

  • XOR của tất cả các phần tử trong một mảng boolean sẽ cho bạn biết nếu mảng đó có số phần tử thực lẻ
  • Nếu bạn có một mảng với tất cả các số lặp lại số lần chẵn ngoại trừ một số lặp lại số lần lẻ bạn có thể tìm thấy bằng cách XOR tất cả các phần tử.
  • Trao đổi giá trị mà không sử dụng biến tạm thời
  • Tìm số bị thiếu trong phạm vi từ 1 đến n
  • Xác nhận cơ bản dữ liệu được gửi qua mạng.

Rất nhiều thủ thuật như vậy có thể được thực hiện bằng cách sử dụng các toán tử bit khôn ngoan, chủ đề thú vị để khám phá.


14

Như những người khác đã nói, đó là XOR bitwise. Nếu bạn muốn tăng một số lên một công suất nhất định, hãy sử dụng Math.pow(a , b), đâu alà số và blà công suất.


13

Quy tắc toán tử XOR

0 ^ 0 = 0
1 ^ 1 = 0
0 ^ 1 = 1
1 ^ 0 = 1

Toán tử bitwise hoạt động trên các bit và thực hiện thao tác từng bit một. Giả sử nếu a = 60 và b = 13; bây giờ ở định dạng nhị phân, chúng sẽ như sau -

a = 0011 1100

b = 0000 1101



a^b ==> 0011 1100  (a)
        0000 1101  (b)
        -------------  XOR
        0011 0001  => 49

(a ^ b) will give 49 which is 0011 0001

8

Liên kết của AraK trỏ đến định nghĩa của độc quyền hoặc, giải thích cách hàm này hoạt động cho hai giá trị boolean.

Phần thông tin còn thiếu là cách áp dụng cho hai số nguyên (hoặc giá trị kiểu số nguyên). Bitwise độc ​​quyền - hoặc được áp dụng cho các cặp chữ số nhị phân tương ứng trong hai số và kết quả được tập hợp lại thành kết quả số nguyên.

Để sử dụng ví dụ của bạn:

  • Đại diện nhị phân của 5 là 0101.
  • Đại diện nhị phân của 4 là 0100.

Một cách đơn giản để xác định XOR bitwise là nói kết quả có 1 ở mọi nơi có hai số đầu vào khác nhau.

Với 4 và 5, sự khác biệt duy nhất là ở vị trí cuối cùng; vì thế

0101 ^ 0100 = 0001 (5 ^ 4 = 1).




7

Đó là toán tử Bitwise xor trong java, kết quả 1 cho các giá trị khác nhau của bit (tức là 1 ^ 0 = 1) và 0 cho cùng một giá trị của bit (tức là 0 ^ 0 = 0) khi một số được viết ở dạng nhị phân.

Ví dụ :-

Để sử dụng ví dụ của bạn:

Biểu diễn nhị phân của 5 là 0101. Biểu diễn nhị phân của 4 là 0100.

Một cách đơn giản để xác định Bitwise XOR là nói kết quả có 1 ở mọi nơi có hai số đầu vào khác nhau.

0101 ^ 0100 = 0001 (5 ^ 4 = 1).


6

Đó là bởi vì bạn đang sử dụng toán tử xor.

Trong java, hoặc bất kỳ ngôn ngữ nào khác, ^ là bitwise xor, nên dĩ nhiên,

10 ^ 1 = 11. thông tin thêm về toán tử bitwise

Thật thú vị khi Java và C # không có toán tử công suất.


2

Đây là toán tử bitor xor trong java, kết quả 1 cho các giá trị khác nhau (tức là 1 ^ 0 = 1) và 0 cho cùng một giá trị (tức là 0 ^ 0 = 0).


2

^ là nhị phân (như trong cơ sở-2) xor, không phải lũy thừa (không có sẵn như là một toán tử Java). Để biết lũy thừa, xem java.lang.Math.pow ().


2

Đây là toán tử XOR. Nó được sử dụng để làm các hoạt động bit trên số. Nó có hành vi sao cho khi bạn thực hiện thao tác xor trên cùng các bit, hãy nói 0 XOR 0/1 XOR 1 kết quả là 0. Nhưng nếu bất kỳ bit nào khác thì kết quả là 1. Vì vậy, khi bạn đã làm 5 ^ 3 thì bạn có thể nhìn vào các số 5, 6 này ở dạng nhị phân của chúng và do đó biểu thức trở thành (101) XOR (110) cho kết quả (011) có biểu diễn thập phân là 3.


0

Trong các ngôn ngữ khác như Python, bạn có thể thực hiện 10 ** 2 = 100, hãy thử nó.

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.