รู้จักกับ 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) นั้นจะแบ่งแยกด้วยความเหมือนหรือความต่าง เราจำง่ายๆว่า
- ถ้า A และ B มีค่าความจริงเหมือนกัน เช่น เป็นจริงทั้งคู่ ผลลัพธ์จะออกมาเป็น False
- ถ้าค่าความจริงของ A และ B ต่างกันผลลที่ได้ออกมาจะเป็น True
แล้วเราจะเอา 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 ของเราได้