วันเสาร์ที่ 29 มกราคม พ.ศ. 2565

Logical operator!!!

พอดีว่าผมต้องทำ method GetDown เอาไว้ใช้เอง เพราะว่าหาใน doc แล้วมันไม่เจอ มีแต่ get value แบบต่อเนื่อง frame by frame

หลักการของมันก็คือจะ return true ก็ต่อเมื่อ state ก่อนหน้าไม่เป็นจริง แต่ state ปัจจุบันเป็นจริง ที่เหลือคือ return  false ทั้งหมด

ตัวอย่าง

ตะกี้ยังไม่ได้กด key A แต่ตอนนี้กด key A แล้ว

แต่มันก็ไม่ได้ง่ายปานนั้น เพราะผมจะต้องเปลี่ยน state เดิมด้วย

ต่อจากตัวอย่างข้างบน

พอตอนนี้กด key A แล้วแต่ไม่ยอมปล่อยมือ ในระหว่างที่กด key A ค้าง ผมก็ไม่ควรได้ return value เป็น true เพราะถ้าได้ true มันก็คือกันกับ get value แบบต่อเนื่อง ใช่มะ

เราก็จะเห็นภาพคร่าวๆแล้วว่า method นี้มันทำงานประมาณนี้

  1. อัพเดต state เสมอ
  2. return true เมื่อ state ก่อนหน้าเป็น false และ state ปัจจุบันเป็น true

ทีนี้พอวิเคราะห์ดูดีๆ จะเห็นว่ามันไม่จำเป็นต้องอัพเดต state ตลอดเวลาหรอก เราแค่ไปอัพเดตมันตอนกด key A ครั้งแรก กับตอนปล่อย key A ก็ได้นี่

สุดท้าย ท้ายสุด method นี้มันก็จะทำงานแบบนี้ 

  1. อัพเดต state เมื่อ state ก่อนหน้า ไม่เท่ากับ state ปัจจุบัน
  2. return true เมื่อ state ก่อนหน้าเป็น false และ state ปัจจุบันเป็น true

ด้วยความมึนของผม ผมเขียนโค้ดออกมาเป็นแบบนี้

โค้ดผมเป็น c# นะ เผื่อวาน syntax ภาษาอื่นมันไม่เหมือนกัน

//
bool prev
bool current
if (!prev && current) {
	prev = true
} else if (prev && !current) {
	prev = false
}
//

พอเห็นมันมี if รุงรังขนาดนี้ก็เลยอยากลดโค้ดลง พอดีนึกถึง logical operator ได้พอดี ในเคสที่เราดูกันนี้มันจะเปลี่ยน state ก็ต่อเมื่อ prev กับ current ไม่เท่ากัน มันก็จะมี operator ตัวนึงที่จะได้ผลเป็น true เมื่อ value ทั้งสองฝั่งไม่เหมือนกันด้วย

มันก็คือ XOR นั่นเอง!!

พอรู้แบบนี้แล้วก็ต้องจัดเลย โอ้แม่เจ้า

//
bool prev
bool current
if (prev ^ current) {
	prev = current
}
//

ซึ่งเอาจริงๆแล้ว มันเขียนแค่นี้ก็ได้คือกัน 555

//
bool prev
bool current
if (prev != current) {
	prev = current
}

ผมควรไปนอนแหละ😴

ไม่มีความคิดเห็น:

แสดงความคิดเห็น

Logical operator!!!

พอดีว่าผมต้องทำ method GetDown เอาไว้ใช้เอง เพราะว่าหาใน doc แล้วมันไม่เจอ มีแต่ get value แบบต่อเนื่อง frame by frame หลักการของมันก็คือจะ ...