ตัวดำเนินการ ^ ทำอะไรใน Java


294

ฟังก์ชั่นอะไร^(รูปหมวก) ผู้ประกอบการบริการใน Java?

เมื่อฉันลองทำสิ่งนี้:

int a = 5^n;

... มันทำให้ฉัน:

สำหรับ n = 5, ส่งคืน 0
สำหรับ n = 4, ส่งคืน 1
สำหรับ n = 6, ส่งคืน 3

... ดังนั้นฉันคิดว่ามันไม่ได้ทำการยกกำลัง แต่แล้วมันคืออะไร?


5
คุณสามารถโพสต์รหัสจริงที่คุณใช้อยู่ได้หรือไม่?
Anthony Forloney

ฉันใช้ eclipse และคืนค่านี้ 11. คลาสสาธารณะ SimpleParser {public void main หลัก (String [] args) {System.out.println ((10 ^ 1)); }}

2
ใน Java ^ตัวดำเนินการไม่ได้มีไว้สำหรับชุดพลังงาน คุณจะต้องMath.powแทน ดูคำตอบของ polygenelubricant
Anthony Forloney

@WizardOfOdds: เห็นด้วยนี่เป็นคำถามที่ดี ( ^สำหรับการยกกำลังหรือไม่นั่นเป็นเพียงสามัญสำนึก!) การสำรวจภาษาจาวาต้องการให้กำลังใจ
polygenelubricants

คำตอบ:


419

ตัวดำเนินการ ^ ใน Java

^ ใน Java เป็นตัวดำเนินการพิเศษหรือ ("xor")

ลอง5^6ยกตัวอย่าง:

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

นี่คือตารางความจริงสำหรับ bitwise ( JLS 15.22.1 ) และ logical ( JLS 15.22.2 ) xor:

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

ยิ่งไปกว่านั้นคุณยังสามารถคิดถึง xor ว่า "สิ่งนี้หรือสิ่งนั้น แต่ไม่ใช่ทั้งสองอย่าง !"

ดูสิ่งนี้ด้วย


การยกกำลังใน Java

สำหรับการยกกำลังเลขจำนวนเต็มน่าเสียดายที่ Java ไม่มีโอเปอเรเตอร์ดังกล่าว คุณสามารถใช้double Math.pow(double, double)(ชี้ขาดผลลัพธ์เพื่อintหากจำเป็น)

คุณยังสามารถใช้เคล็ดลับการเลื่อนบิตแบบดั้งเดิมเพื่อคำนวณพลังบางอย่างของทั้งสอง นั่นคือ(1L << k)เป็นสองถึงkอำนาจ -th k=0..63สำหรับ

ดูสิ่งนี้ด้วย


ผสานบันทึก : คำตอบนี้ถูกผสานจากคำถามอื่นที่ต้องการใช้การยกกำลังเพื่อแปลงสตริง"8675309"เป็นintโดยไม่ใช้Integer.parseIntเป็นแบบฝึกหัดการเขียนโปรแกรม ( ^หมายถึงการยกกำลังนับจากนี้เป็นต้นไป) ความตั้งใจที่ OP ก็คือการคำนวณ8*10^6 + 6*10^5 + 7*10^4 + 5*10^3 + 3*10^2 + 0*10^1 + 9*10^0 = 8675309; ส่วนต่อไปของที่อยู่คำตอบนี้ไม่จำเป็นต้องมีการยกกำลังสำหรับงานนี้

โครงการของ Horner

ที่อยู่เฉพาะของคุณความต้องการคุณคุณไม่จำเป็นต้องคำนวณพลังต่าง ๆ จำนวน 10 คุณสามารถใช้สิ่งที่เรียกว่าแบบแผนของ Hornerซึ่งไม่เพียง แต่เรียบง่าย แต่มีประสิทธิภาพ

เนื่องจากคุณกำลังทำสิ่งนี้เป็นการออกกำลังกายส่วนตัวฉันจะไม่ให้รหัส Java แต่นี่เป็นแนวคิดหลัก:

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

มันอาจดูซับซ้อนในตอนแรก แต่จริงๆแล้วไม่ใช่ โดยทั่วไปแล้วคุณอ่านตัวเลขจากซ้ายไปขวาและคูณผลลัพธ์ของคุณจนถึง 10 ก่อนที่จะเพิ่มตัวเลขถัดไป

ในรูปแบบตาราง:

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
เพียงเพิ่มคำตอบนี้ฟังก์ชันที่ OP กำลังมองหาน่าจะเป็น Math.pow (10, 1)
tjohns20

146

อย่างที่หลายคนชี้ไปแล้วมันคือผู้ดำเนินการXOR หลายคนยังได้ชี้ให้เห็นแล้วว่าถ้าคุณต้องการยกกำลังแล้วคุณจะต้องใช้Math.pow

แต่ฉันคิดว่ามันมีประโยชน์ที่จะทราบว่า^เป็นเพียงหนึ่งในครอบครัวของผู้ประกอบการที่รู้จักกันในชื่อผู้ประกอบการระดับบิต:

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.

จากที่นี่

โอเปอเรเตอร์เหล่านี้สามารถใช้งานได้สะดวกเมื่อคุณจำเป็นต้องอ่านและเขียนจำนวนเต็มโดยที่แต่ละบิตควรตีความเป็นแฟล็กหรือเมื่อช่วงของบิตเฉพาะในจำนวนเต็มมีความหมายพิเศษและคุณต้องการแยกเฉพาะ คุณสามารถทำการเขียนโปรแกรมจำนวนมากได้ทุกวันโดยไม่จำเป็นต้องใช้ตัวดำเนินการเหล่านี้ แต่ถ้าคุณต้องทำงานกับข้อมูลในระดับบิตความรู้ที่ดีของตัวดำเนินการเหล่านี้นั้นมีค่ามาก



20

กฎตัวดำเนินการ XOR =>

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

การแทนแบบไบนารีของ 4, 5 และ 6:

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

ตอนนี้ทำการดำเนินการ XOR ในวันที่ 5 และ 4:

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

ในทำนองเดียวกัน

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

หลาย ๆ คนได้อธิบายเกี่ยวกับสิ่งที่มันเป็นและวิธีการใช้ แต่นอกเหนือจากที่เห็นได้ชัดคุณสามารถใช้ตัวดำเนินการนี้เพื่อทำเทคนิคการเขียนโปรแกรมจำนวนมากเช่น

  • XOR ขององค์ประกอบทั้งหมดในอาร์เรย์บูลีนจะบอกคุณว่าอาร์เรย์มีจำนวนจริงขององค์ประกอบ
  • หากคุณมีอาเรย์ที่มีตัวเลขทั้งหมดซ้ำหลายครั้งยกเว้นหนึ่งตัวที่ซ้ำจำนวนคี่ซ้ำคุณจะพบว่าโดย XORing องค์ประกอบทั้งหมด
  • การสลับค่าโดยไม่ต้องใช้ตัวแปรชั่วคราว
  • ค้นหาตัวเลขที่ขาดหายไปในช่วง 1 ถึง n
  • การตรวจสอบความถูกต้องเบื้องต้นของข้อมูลที่ส่งผ่านเครือข่าย

เทคนิคดังกล่าวมากมายสามารถทำได้โดยใช้ตัวดำเนินการ bit wise หัวข้อที่น่าสนใจในการสำรวจ


14

อย่างที่คนอื่นพูดกันมันคือ bitor XOR หากคุณต้องการเพิ่มจำนวนให้เป็นกำลังงานที่กำหนดให้ใช้Math.pow(a , b)ที่ไหนaก็คือจำนวนและbเป็นกำลังงาน


13

กฎตัวดำเนินการ XOR

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

ตัวดำเนินการ Bitwise ทำงานบนบิตและทำการดำเนินการทีละบิต สมมติว่า a = 60 และ b = 13; ตอนนี้ในรูปแบบไบนารีพวกเขาจะเป็นดังนี้ -

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 ชี้ไปที่คำจำกัดความของเอกสิทธิ์เฉพาะหรือซึ่งอธิบายการทำงานของฟังก์ชันนี้สำหรับค่าบูลีนสองค่า

ข้อมูลที่ขาดหายไปคือวิธีการนี้นำไปใช้กับจำนวนเต็มสองจำนวน (หรือค่าประเภทจำนวนเต็ม) Bitwise แบบเอกสิทธิ์เฉพาะบุคคลหรือถูกนำไปใช้กับคู่ของเลขฐานสองที่สอดคล้องกันในสองตัวเลขและผลลัพธ์จะประกอบใหม่เป็นผลจำนวนเต็ม

ในการใช้ตัวอย่างของคุณ:

  • การแทนเลขฐานสองของ 5 คือ 0101
  • การแทนเลขฐานสองของ 4 คือ 0100

วิธีง่ายๆในการกำหนด bitor XOR คือการบอกว่าผลลัพธ์มี 1 ในทุกสถานที่ซึ่งตัวเลขอินพุตทั้งสองแตกต่างกัน

ด้วย 4 และ 5 ความแตกต่างเพียงอย่างเดียวคือในสถานที่สุดท้าย ดังนั้น

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



7

ตามที่ระบุไว้แล้วโดยคำตอบอื่น ๆ (s), มันเป็น"แต่เพียงผู้เดียวหรือ" (แฮคเกอร์) ผู้ประกอบการ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวดำเนินการบิตใน Java โปรดดู: http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html


7

มันเป็นตัวดำเนินการ Bitwise xor ใน java ซึ่งผลลัพธ์ 1 สำหรับค่าที่แตกต่างกันของบิต (เช่น 1 ^ 0 = 1) และ 0 สำหรับค่าของบิตเดียวกัน (เช่น 0 ^ 0 = 0) เมื่อตัวเลขถูกเขียนในรูปแบบไบนารี

เช่น: -

ในการใช้ตัวอย่างของคุณ:

การแทนค่าฐานสองของ 5 คือ 0101 การแทนค่าฐานสองของ 4 คือ 0100

วิธีง่ายๆในการกำหนด Bitwise XOR คือการบอกว่าผลลัพธ์มี 1 ในทุกสถานที่ที่มีการป้อนตัวเลขสองตัว

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


6

นั่นเป็นเพราะคุณกำลังใช้ตัวดำเนินการ xor

ในภาษาจาวาหรือเกือบจะเป็นภาษาอื่น ๆ ^ เป็น bitwise xor ดังนั้นแน่นอน

10 ^ 1 = 11. ข้อมูลเพิ่มเติมเกี่ยวกับผู้ประกอบการระดับบิต

เป็นที่น่าสนใจว่า Java และ C # ไม่มีตัวดำเนินการพลังงาน


2

มันเป็นตัวดำเนินการ bitor xor ใน java ซึ่งผลลัพธ์ 1 สำหรับค่าที่แตกต่าง (เช่น 1 ^ 0 = 1) และ 0 สำหรับค่าเดียวกัน (เช่น 0 ^ 0 = 0)


2

^ คือไบนารี (ดังในฐาน -2) xor ไม่ใช่การยกกำลัง (ซึ่งไม่พร้อมใช้งานในฐานะตัวดำเนินการ Java) สำหรับการยกกำลังดู java.lang.Math.pow ()


2

มันเป็นตัวดำเนินการ XOR มันใช้เพื่อทำการบิตกับตัวเลข มันมีพฤติกรรมแบบนั้นเมื่อคุณทำการดำเนินการ xor บนบิตเดียวกันบอกว่า 0 XOR 0/1 XOR 1 ผลที่ได้คือ 0 แต่ถ้าบิตใด ๆ ที่แตกต่างจากนั้นผลลัพธ์คือ 1 ดังนั้นเมื่อคุณทำ 5 ^ 3 แล้วคุณ สามารถดูตัวเลขเหล่านี้ 5, 6 ในรูปแบบไบนารีของพวกเขาและทำให้การแสดงออกกลายเป็น (101) XOR (110) ซึ่งให้ผล (011) ซึ่งเป็นตัวแทนทศนิยมเป็น 3


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.