^ Operatörü Java'da ne yapar?


295

^(Düzeltme) operatörü Java'da hangi işlevi yerine getirir ?

Bunu denediğimde:

int a = 5^n;

... bana veriyor:

n = 5
için n = 4 için 0 döndürür
, n = 6 için 1 döndürür, 3 döndürür

... bu yüzden sanırım üstelleştirme yapmıyor. Peki o zaman ne?


5
Kullandığınız gerçek kodu gönderebilir misiniz?
Anthony Forloney

Eclipse kullanıyorum ve bu 11 döndürür. Public class SimpleParser {public static void main (String [] args) {System.out.println ((10 ^ 1)); }}

2
Java'da, ^operatör güç ayarı için değildir. Bunun Math.powyerine ihtiyacınız olacak . Poligenelubrikanın cevabına bakınız.
Anthony Forloney

@WizardOfOdds: kabul etti, bu iyi bir soru ( ^üs alma için mi? Bu sadece sağduyu!). OP'nin Java dilini araştırması cesaret vericidir.
poligenelubrikantlar

Yanıtlar:


420

Java'daki ^ işleci

^ Java'da münhasır veya ("xor") operatörüdür.

En alalım 5^6örnek olarak:

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

Bu bitsel ( JLS 15.22.1 ) ve mantıksal ( JLS 15.22.2 ) xor için doğruluk tablosu :

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

Daha basit olarak, xor'u "şu ya da bu, ama her ikisi de değil !" Olarak düşünebilirsiniz .

Ayrıca bakınız


Java'da Üstelleştirme

Tamsayı üssüne gelince, maalesef Java'nın böyle bir operatörü yoktur. Kullanabilirsiniz double Math.pow(double, double)( intgerekirse sonucu döküm ).

Ayrıca, ikisinin bazı güçlerini hesaplamak için geleneksel bit kaydırma hilesini de kullanabilirsiniz. Yani, k- gücünün (1L << k)ikisidir .k=0..63

Ayrıca bakınız


Birleştirme notu : Bu yanıt niyeti bir dize dönüştürmek için üs kullanmaktı başka sorudan birleştirilmiştir"8675309"içinintkullanmadanInteger.parseInt(bir programlama egzersiz olarak^şu andan itibaren O anlamına gelir üs). OP'nin amacı hesaplamaktı8*10^6 + 6*10^5 + 7*10^4 + 5*10^3 + 3*10^2 + 0*10^1 + 9*10^0 = 8675309; bu cevabın bir sonraki kısmı, bu görev için üslemenin gerekli olmadığını ele almaktadır.

Horner'ın şeması

Senin seslenen belirli ihtiyacı, aslında sen ne denir kullanabilirsiniz 10 farklı güçler hesaplamak gerekmez Horner düzeni basit ama aynı zamanda verimli değil sadece.

Bunu kişisel bir egzersiz olarak yaptığınızdan, Java kodunu vermeyeceğim, ancak asıl fikir:

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

İlk başta karmaşık görünebilir, ama gerçekten değil. Temel olarak soldan sağa rakamları okursunuz ve bir sonraki rakamı eklemeden önce sonucunuzu şimdiye kadar 10 ile çarpıyorsunuz.

Tablo formunda:

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
sadece bu cevaba eklemek için OP'nin aradığı fonksiyon muhtemelen Math.pow (10, 1)
tjohns20

146

Birçok kişinin belirttiği gibi, XOR operatörü. Birçok kişi zaten üs istiyorsanız, Math.pow kullanmanız gerektiğini de belirtti .

Ancak bence ^, toplu olarak bitsel operatörler olarak bilinen bir operatör ailesinden sadece biri olduğunu belirtmek yararlı olur :

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.

Gönderen burada .

Bu işleçler, tek tek bitlerin bayrak olarak yorumlanması gereken tamsayılara okuma ve yazma gerektiğinde veya bir tamsayıdaki belirli bir bit aralığının özel bir anlamı olduğunda ve yalnızca bunları çıkarmak istediğinizde kullanışlı olabilir. Bu operatörleri kullanmaya gerek kalmadan her gün birçok programlama yapabilirsiniz, ancak bit düzeyinde verilerle çalışmak zorunda kalırsanız, bu operatörler hakkında iyi bir bilgi paha biçilmezdir.


34

Bitwise XOR, Java'nın bir üstelleştirme operatörü yok, Math.pow()bunun yerine kullanmak zorunda kalacaksınız .


20

XOR operatör kuralı =>

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

4, 5 ve 6'nın ikili gösterimi:

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

şimdi, 5 ve 4'te XOR işlemini gerçekleştirin:

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

Benzer şekilde,

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

Birçok insan ne olduğunu ve nasıl kullanılabileceğini zaten açıkladı, ancak bariz olanın dışında, bu operatörü bir çok programlama hilesi yapmak için kullanabilirsiniz.

  • Bir boole dizisindeki tüm öğelerin XORing değeri, dizinin tek sayıda gerçek öğeye sahip olup olmadığını söyler
  • Tek sayıları yineleyen tek sayı dışında yinelenen tüm sayıları içeren bir diziniz varsa, bunu tüm öğeleri XORing yaparak bulabilirsiniz.
  • Geçici değişken kullanmadan değerleri değiştirme
  • 1 - n aralığında eksik sayı bulma
  • Ağ üzerinden gönderilen verilerin temel doğrulaması.

Birçok bilge operatörler, keşfetmek için ilginç bir konu kullanılarak yapılabilir.


14

Diğerlerinin söylediği gibi, XOR bitsel. Bir sayıyı belirli bir güce yükseltmek istiyorsanız, kullanın Math.pow(a , b), nerede abir sayı ve bgüçtür.


13

XOR operatör kuralı

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

Bitsel işleci bitler üzerinde çalışır ve bitler halinde işlem gerçekleştirir. A = 60 ve b = 13 olup olmadığını varsayalım; şimdi ikili biçimde şu şekilde olacaklar -

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

AraK'ın bağlantısı, bu işlevin iki boole değeri için nasıl çalıştığını açıklayan exclusive- veya tanımına işaret eder.

Eksik bilgi, bunun iki tamsayı (veya tamsayı tipi değerler) için nasıl geçerli olduğudur. Bitwise exclusive- veya karşılık gelen ikili basamak çiftlerine iki sayı olarak uygulanır ve sonuçlar bir tamsayı sonucuna yeniden birleştirilir.

Örneğinizi kullanmak için:

  • 5'in ikili gösterimi 0101'dir.
  • 4'ün ikili gösterimi 0100'dür.

Bitsel XOR'u tanımlamanın basit bir yolu, sonucun iki giriş numarasının farklı olduğu her yerde 1 olduğunu söylemektir.

4 ve 5 ile, tek fark son sıradadır; yani

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




7

Java'daki Bitwise xor işleci olup, bir sayı ikili biçimde yazıldığında farklı bit değeri (yani 1 ^ 0 = 1) için 1 ve aynı bit değeri (yani 0 ^ 0 = 0) için 0 sonucunu verir.

ör .:

Örneğinizi kullanmak için:

5'in ikili gösterimi 0101'dir. 4'ün ikili gösterimi 0100'dür.

Bitwise XOR'u tanımlamanın basit bir yolu, sonucun iki giriş numarasının farklı olduğu her yerde 1 olduğunu söylemektir.

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



2

Java'daki bitsel x veya operatördür, bu da farklı değer için 1 (yani 1 ^ 0 = 1) ve aynı değer için 0 (yani 0 ^ 0 = 0) ile sonuçlanır.


2

^ ikili (taban-2'de olduğu gibi) x veya üstel değil (Java işleci olarak kullanılamaz). Üstelleme için bkz. Java.lang.Math.pow ().


2

XOR operatörüdür. Sayılarda bit işlemleri yapmak için kullanılır. Aynı bitlerde bir xor işlemi yaptığınızda 0 XOR 0/1 XOR 1 diyelim ki sonuç 0 olur. Ancak bitlerden herhangi biri farklıysa sonuç 1 olur. Yani 5 ^ 3 yaptığınızda 5, 6 sayılarına ikili biçimlerinden bakabilir ve böylece ifade, ondalık temsili 3 olan sonucu (011) veren (101) XOR (110) olur.


0

Python gibi diğer dillerde 10 ** 2 = 100 yapabilirsiniz, deneyin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.