Jitrak Blog

Bitwise C# [3/3] Apply Bitwise

ประยุกต์การใช้งาน Bitwise กับงานจริง

10 Jan 2020 00:00

Written by: Yosapol Jitrak

Tags:

CSharp

Bitwise

บทความนี้เป็นการนำบทความที่เคยเขียนเมื่อหลายปีมาแล้ว มาทำการ 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 Friendship21s

ถ้าอยากลองเล่นก็สามารถไป Download ได้ทั้ง Google Play Store และ App Store

Friendship21s

Friendship21s

จะเห็นได้ว่าหากเราเสียเวลาคิด หาข้อมูล และนำมาประยุกต์ใช้ก่อนที่จะลุยลงมือทำเลย
อาจจะช่วยเราลดความยุ่งยากซับซ้อนในการทำงานของเราไปได้มาก

Link: Bitwise C# [1/3] Why to Bitwise
Link: Bitwise C# [2/3] Bitwise Operator