การเพิ่มคำตอบที่ยอดเยี่ยมของ FatalError บรรทัดreturn f(b)^f(a-1);
นี้สามารถอธิบายได้ดีขึ้น ในระยะสั้นเป็นเพราะ XOR มีคุณสมบัติที่ยอดเยี่ยมเหล่านี้:
- มันเชื่อมโยง - วางวงเล็บทุกที่ที่คุณต้องการ
- เป็นการสับเปลี่ยน - ซึ่งหมายความว่าคุณสามารถเคลื่อนย้ายโอเปอเรเตอร์ไปรอบ ๆ (พวกเขาสามารถ "เดินทาง" ได้)
นี่คือการดำเนินการทั้งสองอย่าง:
(a ^ b ^ c) ^ (d ^ e ^ f) = (f ^ e) ^ (d ^ a ^ b) ^ c
แบบนี้:
a ^ b = c
c ^ a = b
การบวกและการคูณเป็นสองตัวอย่างของตัวดำเนินการเชื่อมโยง / สับเปลี่ยนอื่น ๆ แต่จะไม่ย้อนกลับตัวเอง โอเคคุณสมบัติเหล่านี้สำคัญไฉน? เส้นทางง่ายๆคือขยายออกไปสู่สิ่งที่เป็นจริงจากนั้นคุณจะเห็นคุณสมบัติเหล่านี้ในที่ทำงาน
ก่อนอื่นให้กำหนดสิ่งที่เราต้องการและเรียกมันว่า n:
n = (a ^ a+1 ^ a+2 .. ^ b)
ถ้าช่วยได้ให้นึกถึง XOR (^) ราวกับว่ามันเป็นส่วนเสริม
ลองกำหนดฟังก์ชั่น:
f(b) = 0 ^ 1 ^ 2 ^ 3 ^ 4 .. ^ b
b
มีค่ามากกว่าa
ดังนั้นเพียงแค่ใส่วงเล็บเสริมสองสามอันอย่างปลอดภัย (ซึ่งเราทำได้เพราะมันเชื่อมโยงกัน) เรายังสามารถพูดสิ่งนี้ได้:
f(b) = ( 0 ^ 1 ^ 2 ^ 3 ^ 4 .. ^ (a-1) ) ^ (a ^ a+1 ^ a+2 .. ^ b)
ซึ่งง่ายต่อการ:
f(b) = f(a-1) ^ (a ^ a+1 ^ a+2 .. ^ b)
f(b) = f(a-1) ^ n
ต่อไปเราจะใช้คุณสมบัติการกลับตัวและการสับเปลี่ยนเพื่อให้เส้นเวทย์มนตร์แก่เรา:
n = f(b) ^ f(a-1)
หากคุณเคยคิดว่า XOR เป็นเหมือนการเพิ่มคุณจะได้ลบลบตรงนั้น XOR คือ XOR สิ่งที่เพิ่มคือการลบ!
ฉันจะทำสิ่งนี้ด้วยตัวเองได้อย่างไร?
จำคุณสมบัติของตัวดำเนินการทางตรรกะ ทำงานกับพวกเขาเกือบจะเหมือนการบวกหรือการคูณถ้ามันช่วยได้ รู้สึกผิดปกติที่และ (&), xor (^) และหรือ (|) เชื่อมโยงกัน แต่เป็น!
เรียกใช้การใช้งานแบบไร้เดียงสาก่อนอื่นให้มองหารูปแบบในผลลัพธ์จากนั้นเริ่มค้นหากฎที่ยืนยันว่ารูปแบบนั้นเป็นจริง ทำให้การใช้งานของคุณง่ายยิ่งขึ้นและทำซ้ำ นี่อาจเป็นเส้นทางที่ผู้สร้างดั้งเดิมใช้โดยเน้นด้วยความจริงที่ว่ามันไม่เหมาะสมอย่างสมบูรณ์ (เช่นใช้คำสั่งสวิตช์แทนอาร์เรย์)