Codding Gun

รู้จักกับ Exclusive OR(XOR)

ก่อนอื่นลองดูค่าความจริงของ Exclusive OR(XOR) กันก่อน

A B A XOR B
T T F
T F T
F T T
F F F

ซึ่งเราจะเห็นว่าการทำ Exclusive OR(XOR) นั้นจะแบ่งแยกด้วยความเหมือนหรือความต่าง เราจำง่ายๆว่า

แล้วเราจะเอา XOR ไปใช้ตอนไหน

การนำ XOR ไปใช้ในการเขียนโปรแกรมนั้นจะอยู่ในส่วนของการเลือก เช่น ถ้าเรามีโจทย์ที่ให้ customer เลือกอยู่ได้แต่ group A หรือ B เท่านั้น สิ่งแรกที่ developer ส่วนใหญ่คิดถึงคือ OR เพราะอยู่ใน group A หรือ B ก็ได้แต่คำว่า หรือ หมายถึงเราสามารถอยู่ได้ทั้งคู่ ซึ่งอาจไม่ตรงกับความต้องการจริงๆ ในภาษาอังกฤษจะใช้ either … or …(อย่างใดอย่างหนึ่ง)

ตัวอย่าง เรามี configuration 2 ตัวคือ A และ B ถ้าเรากำหนด A เป็น True แล้วเราจะไม่สามารถกำหนด B เป็น True ได้อีก

ถ้าเราเขียนแบบไม่ใช้ XOR จะได้ Code ประมาณนี้

if( ( a && !b ) || ( !a && b ) ) {
  // do something here
}

เราต้องตรวจสอบว่าถ้า a เป็น true แล้ว b ต้องเป็น false หรือถ้า a เป็น false b จะต้องเป็น true(ตรงข้ามกัน) ซึ่งเราสามารถปรับ code ให้ง่ายขึ้นด้วยการใช้ XOR แบบนี้

if( a ^ b ) {   // ^ เป็น XOR Operator ใน JavaScript
  // do something here
}

จะเห็นว่า code ที่เราเขียนจะอ่านง่ายขึ้นมากๆ แต่คนที่อ่านก็ต้องเข้าใจ XOR ด้วยเหมือนกัน

การใช้ XOR ในระดับของ Bit

XOR สามารถนำไปใช้กับการจัดการ Bitwise(ค่า 0 หรือ 1) ได้เพราะมันสามารถถอดกลับมาได้ ซึ่ง XOR ถือว่าเป็นต้นกำเนิดของการเข้ารหัสและถอดรหัส(Encryption) เลยทีเดียว

ตัวอย่าง สมมุติว่าเรามีข้อมูลเป็น 01101001 และผมสร้าง key ในการเข้ารหัสเป็น 00110011 หลังจากนั้นก่อนจะส่งข้อความผมจะเข้ารหัสด้วยการนำเอา 01101001 มา XOR กับ 00110011 ผลลัพธ์จะได้ออกมาเป็น 01011010 ตามตารางนี้(เหมือนกันเป็น 0 ต่างกันเป็น 1)

XOR
01101001 <– Plain Text
00110011 <– Key
01011010 <– Cipher Text

Plain Text คือข้อความก่อนเข้ารหัส Key คือกุญแจที่ใช้ในการเข้ารหัสและถอดรหัส Cipher Text คือข้อความที่ได้หลังจากเข้ารหัส และจะส่งไปยังผู้รับเพื่อถอดรหัสออกมาใช้งานต่อไป

หลังจากนั้นเราจะส่งข้อมูลที่ถูกเข้ารหัส 01011010 ไปให้เพื่อนและเพื่อนเราก็จะนำ key(00110011) มาถอดรหัสออกมาแบบนี้

XOR
01011010 <– Cipher Text
00110011 <– Key
01101001 <– Plain Text

จะเห็นว่าเราได้ข้อมูลก่อนเข้ารหัสออกมาใช้งาน(01101001) ณ ปัจจุบันเราไม่ได้ใช้ XOR ในการเข้ารหัสและถอดรหัสเพราะคาดเดาได้ง่าย แต่แนวคิดในการเปลี่ยนค่าไปมาแบบนี้สามารถนำไปประยุกต์ใช้กับ การกำหนด permission และส่วนอื่นๆใน program ของเราได้

Phanupong Permpimol
Follow me