ประยุกต์การใช้งาน Bitwise กับงานจริง
10 Jan 2020 00:00
Written by: Yosapol Jitrak
บทความนี้เป็นการนำบทความที่เคยเขียนเมื่อหลายปีมาแล้ว มาทำการ Repost ใหม่หลังจากที่ปูพื้นจาก Bitwise C# [1/3] Why to Bitwise
และ Bitwise C# [2/3] Bitwise Operator
บทความนี้จะพาคุณผู้อ่านไปดูการประยุกต์ใช้กันจริง ๆ กันแล้ว
ไม่รู้ยังจำปัญหาของเราตั้งแต่บทความแรกได้อยู่หรือเปล่า
ขอเกริ่นให้นึกออกกันสักนิดหน่อยนะครับ
ผมได้โจทย์ทำเกมผสมสี มีสีตามนี้ เหมือนเดิมเลยครับ
คิดว่าคงจะนึกออกกันบ้างแล้ว คราวนี้มาต่อกัน
การที่จะทำเรื่อง Bitwise ในภาษา C# ตามโจทย์ของเรานั้น
เรายังต้องใช้ Flags attribute
เพื่อให้ Enum type ของเราสามารถแสดงชุดของ Flags ได้
สุดท้ายแล้วหน้าตาของ ColorType ก็ออกมาเป็นดังนี้
[System.Flags]
public enum ColorType
{
White = 0,
Red = 1 << 0,
Blue = 1 << 1,
Yellow = 1 << 2,
Purple = Red | Blue,
Orange = Red | Yellow,
Green = Blue | Yellow,
}
เวลาเอาไปใช้งานก็จะประมาณนี้
ColorType colorType = color1 | color2;
bool isPurple = colorType == ColorType.Purple;
ขอยกอีกตัวอย่างนึงเป็นเรื่องเช็คสถานะ Quest ว่าตรงตามเงื่อนไขของเราหรือเปล่า
โดยมี Quest state ดังนี้
[System.Flags]
public enum QuestState
{
/// <summary>
/// Quest is unassigned
/// </summary>
Unassigned = 0x1,
/// <summary>
/// Quest is active (assigned but not completed yet)
/// </summary>
Active = 0x2,
/// <summary>
/// Quest was completed successfully; corresponds to "success" or "done"
/// </summary>
Success = 0x4,
/// <summary>
/// Quest was completed in failure
/// </summary>
Failure = 0x8,
/// <summary>
/// Quest was abandoned
/// </summary>
Abandoned = 0x10
}
อันนี้เอามาจาก Plugin ชื่อว่า Dialogue System
(ที่น่าตามันเป็นแบบนี้ เพราะเขาเขียนในรูปแบบของเลขฐาน 16 นะครับ)
ทีนี้ปัญหามันเกิดก็ตอนที่ต้องการจะเช็คอะไรสักอย่าง
ให้ทำงานก็ต่อเมื่อ Quest เป็นสถานะนึง หรืออีกสถานะนึงก็ได้
เช่น เป็นทั้ง Active หรือ Success ก็ได้ ถึงจะทำงานที่ต้องการ
QuestState matchQuestState = QuestState.Active | QuestState.Success;
การที่เราจะเช็คว่าสถานะ Quest ของเรานั้นเป็นค่าใดค่าหนึ่งในเงื่อนไขหรือเปล่า
เราจะต้องใช้ตัวดำเนินการ &(AND) มาช่วย จะเขียนได้แบบนี้
bool isQuestStateMatch = (quest.QuestState & matchQuestState) == quest.QuestState;
if (isQuestStateMatch) ...
จริง ๆ แล้วโจทย์ผสมสีนี้คือเบื้องหลังของ Minigame นึงจากเกม Friendship21s
ถ้าอยากลองเล่นก็สามารถไป Download ได้ทั้ง Google Play Store และ App Store
จะเห็นได้ว่าหากเราเสียเวลาคิด หาข้อมูล และนำมาประยุกต์ใช้ก่อนที่จะลุยลงมือทำเลย
อาจจะช่วยเราลดความยุ่งยากซับซ้อนในการทำงานของเราไปได้มาก
Link: Bitwise C# [1/3] Why to Bitwise
Link: Bitwise C# [2/3] Bitwise Operator