Apa yang dilakukan operator ^ di Java?

294

Fungsi apa yang ^dilayani oleh operator (tanda sisipan) di Jawa?

Ketika saya mencoba ini:

int a = 5^n;

... itu memberi saya:

untuk n = 5, mengembalikan 0
untuk n = 4, mengembalikan 1
untuk n = 6, mengembalikan 3

... jadi saya kira itu tidak melakukan eksponensial. Tapi lalu apa?

joroj
sumber
5
Bisakah Anda memposting kode aktual yang Anda gunakan?
Anthony Forloney
Saya menggunakan eclipse dan ini mengembalikan 11. kelas publik SimpleParser {public static void main (String [] args) {System.out.println ((10 ^ 1)); }}
2
Di Jawa, ^operator tidak dimaksudkan untuk power set. Anda akan membutuhkannya Math.pow. Lihat jawaban polygenelubricant.
Anthony Forloney
@WizardOfOdds: setuju, ini pertanyaan yang bagus ( ^untuk eksponensial? Itu hanya akal sehat!). Eksplorasi OP tentang bahasa Jawa perlu digalakkan.
polygenelubricants

Jawaban:

419

^ Operator di Jawa

^ di Jawa adalah operator eksklusif-atau ("xor").

Mari kita ambil 5^6contoh:

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

Ini tabel kebenaran untuk bitwise ( JLS 15.22.1 ) dan logis ( JLS 15.22.2 ) xor:

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

Lebih sederhana, Anda juga dapat menganggap xor sebagai "ini atau itu, tetapi tidak keduanya !".

Lihat juga


Eksponen di Jawa

Sedangkan untuk exponentiation integer, sayangnya Java tidak memiliki operator seperti itu. Kamu bisa memakaidouble Math.pow(double, double) (casting hasilnya intjika perlu).

Anda juga dapat menggunakan trik pergeseran bit tradisional untuk menghitung beberapa kekuatan dua. Artinya, (1L << k)dua ke k pangkat -th untuk k=0..63.

Lihat juga


Gabung catatan : jawaban ini digabungkan dari pertanyaan lain di mana tujuannya adalah menggunakan eksponensial untuk mengubah string"8675309"menjadiinttanpa menggunakanInteger.parseIntsebagai latihan pemrograman (^menunjukkan eksponensial mulai sekarang). Niat OP adalah untuk menghitung8*10^6 + 6*10^5 + 7*10^4 + 5*10^3 + 3*10^2 + 0*10^1 + 9*10^0 = 8675309 ; bagian selanjutnya dari jawaban ini membahas bahwa eksponensial tidak diperlukan untuk tugas ini.

Skema Horner

Mengatasi kebutuhan spesifik Anda, Anda sebenarnya tidak perlu menghitung berbagai kekuatan 10. Anda dapat menggunakan apa yang disebut skema Horner , yang tidak hanya sederhana tetapi juga efisien.

Karena Anda melakukan ini sebagai latihan pribadi, saya tidak akan memberikan kode Java, tapi inilah ide utamanya:

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

Pada awalnya mungkin terlihat rumit, tetapi sebenarnya tidak. Anda pada dasarnya membaca angka dari kiri ke kanan, dan Anda mengalikan hasilnya sejauh ini dengan 10 sebelum menambahkan angka berikutnya.

Dalam bentuk tabel:

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
polygenelubricants
sumber
16
hanya untuk menambah jawaban ini, fungsi yang dicari OP mungkin adalah Math.pow (10, 1)
tjohns20
146

Seperti yang telah ditunjukkan oleh banyak orang, ini adalah operator XOR . Banyak orang juga sudah menunjukkan bahwa jika Anda ingin eksponensial maka Anda perlu menggunakan Math.pow .

Tetapi saya pikir ini juga berguna untuk dicatat bahwa ^hanya salah satu dari keluarga operator yang secara kolektif dikenal sebagai operator 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.

Dari sini .

Operator ini dapat berguna ketika Anda perlu membaca dan menulis ke bilangan bulat di mana bit individual harus ditafsirkan sebagai bendera, atau ketika rentang bit tertentu dalam bilangan bulat memiliki makna khusus dan Anda ingin mengekstrak hanya itu. Anda dapat melakukan banyak pemrograman setiap hari tanpa perlu menggunakan operator ini, tetapi jika Anda harus bekerja dengan data pada level bit, pengetahuan yang baik dari operator ini sangat berharga.

Mark Byers
sumber
34

Ini XOR bitwise, Java tidak memiliki operator eksponensial, Anda harus menggunakan Math.pow()sebagai gantinya.

Dan Dyer
sumber
20

Aturan operator XOR =>

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

Representasi biner dari 4, 5 dan 6:

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

sekarang, lakukan operasi XOR pada 5 dan 4:

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

Demikian pula,

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
Sachin Ambalkar
sumber
17

Ini adalah XORoperator bitwise.

AraK
sumber
15

Banyak orang sudah menjelaskan tentang apa itu dan bagaimana itu dapat digunakan tetapi selain dari yang jelas Anda dapat menggunakan operator ini untuk melakukan banyak trik pemrograman seperti

  • XORing semua elemen dalam array boolean akan memberi tahu Anda jika array memiliki jumlah ganjil elemen sebenarnya
  • Jika Anda memiliki array dengan semua angka berulang beberapa kali, kecuali satu yang mengulangi jumlah ganjil Anda dapat menemukannya dengan XORing semua elemen.
  • Nilai tukar tanpa menggunakan variabel sementara
  • Menemukan nomor yang hilang dalam kisaran 1 hingga n
  • Validasi dasar dari data yang dikirim melalui jaringan.

Banyak trik semacam itu dapat dilakukan dengan menggunakan operator yang sedikit bijaksana, topik yang menarik untuk dijelajahi.

Willsteel
sumber
14

Seperti yang orang lain katakan, itu XOR bitwise. Jika Anda ingin menaikkan angka ke daya yang diberikan, gunakan Math.pow(a , b), di mana aangka dan bdaya.

Jon Skeet
sumber
13

Aturan operator XOR

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

Operator bitwise bekerja pada bit dan melakukan operasi bit-by-bit. Asumsikan jika a = 60 dan b = 13; sekarang dalam format biner, mereka akan menjadi sebagai berikut -

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
Mayur Dabhi
sumber
8

Tautan AraK menunjuk ke definisi eksklusif-atau, yang menjelaskan bagaimana fungsi ini bekerja untuk dua nilai boolean.

Sepotong informasi yang hilang adalah bagaimana ini berlaku untuk dua bilangan bulat (atau nilai tipe bilangan bulat). Bitwise eksklusif-atau diterapkan pada pasangan digit biner yang sesuai dalam dua angka, dan hasilnya dirakit kembali menjadi hasil integer.

Untuk menggunakan contoh Anda:

  • Representasi biner dari 5 adalah 0101.
  • Representasi biner dari 4 adalah 0100.

Cara sederhana untuk mendefinisikan bitor XOR adalah dengan mengatakan hasil memiliki 1 di setiap tempat di mana dua nomor input berbeda.

Dengan 4 dan 5, satu-satunya perbedaan adalah di tempat terakhir; begitu

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

Carl Smotricz
sumber
7

Ini adalah operator Bitwise xor di java yang menghasilkan 1 untuk nilai bit yang berbeda (yaitu 1 ^ 0 = 1) dan 0 untuk nilai bit yang sama (yaitu 0 ^ 0 = 0) ketika suatu angka ditulis dalam bentuk biner.

mis .: -

Untuk menggunakan contoh Anda:

Representasi biner dari 5 adalah 0101. Representasi biner dari 4 adalah 0100.

Cara sederhana untuk mendefinisikan Bitwise XOR adalah dengan mengatakan hasil memiliki 1 di setiap tempat di mana dua nomor input berbeda.

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

Nikhil Kumar
sumber
6

Itu karena Anda menggunakan operator xor.

Dalam java, atau hampir semua bahasa lain, ^ bitwise xor, jadi tentu saja,

10 ^ 1 = 11. info lebih lanjut tentang operator bitwise

Sangat menarik bagaimana Java dan C # tidak memiliki operator listrik.

jcao219
sumber
2

Ini adalah operator bitor xor di java yang menghasilkan 1 untuk nilai yang berbeda (yaitu 1 ^ 0 = 1) dan 0 untuk nilai yang sama (yaitu 0 ^ 0 = 0).

GuruKulki
sumber
2

^ adalah biner (seperti pada basis-2) xor, bukan eksponensial (yang tidak tersedia sebagai operator Java). Untuk eksponensial, lihat java.lang.Math.pow ().

Ming-Tang
sumber
2

Ini adalah operator XOR. Ini digunakan untuk melakukan operasi bit pada angka. Ini memiliki perilaku sehingga ketika Anda melakukan operasi xor pada bit yang sama mengatakan 0 XOR 0/1 XOR 1 hasilnya adalah 0. Tetapi jika ada bit yang berbeda maka hasilnya adalah 1. Jadi ketika Anda melakukan 5 ^ 3 maka Anda dapat melihat angka-angka ini 5, 6 dalam bentuk biner mereka dan dengan demikian ungkapan menjadi (101) XOR (110) yang memberikan hasil (011) yang representasi desimalnya adalah 3.

Yug Singh
sumber
0

Dalam bahasa lain seperti Python, Anda dapat melakukan 10 ** 2 = 100, cobalah.

Htechno
sumber