Praneat Blog

Yosapol Jitrak
Game Developer & Game Infrastructure
28 Sep 2017

Bitwise C# [1/3] Why to Bitwise

ตอนแรก ผมว่าจะเขียนเรื่องนี้ตั้งแต่วันแรก ๆ แล้ว แต่ดันไปติด PUBG เสียก่อน
เข้าเรื่องดีกว่า เมื่อเดือนที่แล้ว ทีมได้โจทย์ ให้ทำเกมผสมสี มีสีดังนี้

  • สีขาว
  • สีแดง
  • สีน้ำเงิน
  • สีเหลือง
  • สีม่วง
  • สีส้ม
  • สีเขียว

ซึ่งสีขาวนั้นเป็นสีเริ่มแรก เป็นสีที่ยังไม่ได้เทสีอะไรลงไป
มีสีแดง, น้ำเงิน, เหลือง เป็นแม่สี
และสีมีม่วง, ส้ม, และเขียว เป็นสีที่เกิดจากการผสมแม่สีสองสีเข้าด้วยกัน

ตอนแรกก็อยากจะเขียนเป็นการผสมสีด้วย RGB color เสียด้วยซ้ำ
แต่ด้วยความที่ RGB มันใช้สีเขียว ไม่ใช่สีเหลือง และโจทย์มีแค่นี้
ถาม Game designer แล้ว มันจะไม่มีอะไรงอกไปมากกว่านี้
จึงตัดสินใจใช้ Enum type

public enum ColorType
{
    White,
    Red,
    Blue,
    Yellow,
}


ก็จะดูเหมือนทึกไป หากเขียนแบบไม่คิดอะไร เช่น

bool isRed = color1 == ColorType.Red;
bool isPurple = (color1 == ColorType.Red && color2 == ColorType.Blue) ||
    (color1 == ColorType.Blue && color2 == ColorType.Red);

เพื่อการเช็คว่าเป็นสีเดี่ยว หรือสีผสม และต้องทำครบทุกสี
จึงนึกออกว่าสามารถใช้ความรู้เรื่อง bitwise ได้

หากคุณผู้อ่านเคยทำเรื่อง Files / Directory permission
อาจจะเคยเห็นเลข 755, 644, 400 อะไรแบบนี้มา
ไอ้เลขพวกนี้ เอาไว้คอยบอกว่ามีผู้ใช้แต่ล่ะประเภทมีสิทธิ์อะไรบ้าง
กับ File หรือ Directory นั้น

เลขหลักแรก กำหนดสิทธิ์เจ้าของ Files / Directory (Owner)
เลขหลักที่สอง กำหนดสิทธิ์ของผู้ใช้กลุ่มเดียวกับเจ้าของ Files / Directory (Group)
เลขหลักที่สาม กำหนดสิทธิ์ของผู้ใช้อื่น ๆ (Others)

โดยตัวเลขที่ไว้กำหนดสิทธิ์ มีอยู่ 4 ชนิด คือ
0 = ไม่มีสิทธิ์อะไรใด ๆ เลย
1 = Execute
2 = Write
4 = Read

คราวนี้หากต้องการให้ผู้ใช้มีสิทธิ์หลายสิทธิ์ ก็จะเป็นดังนี้
3 = Write และ Execute
5 = Read และ Execute
6 = Read และ Write
7 = Read, Write และ Execute

เพราะฉะนั้น
755 จึงหมายถึง

  • เจ้าของสามารถ อ่าน เขียน และ Execute ได้ทั้งหมด
  • ผู้ใช้กลุ่มเดียวกับเจ้าของสามารถ อ่าน และ Execute ได้
  • ผู้ใช้อื่น ๆ สามารถ อ่าน และ Execute ได้

644 จึงหมายถึง

  • เจ้าของสามารถ อ่าน และเขียน ได้
  • ผู้ใช้กลุ่มเดียวกับเจ้าของสามารถ อ่าน ได้อย่างเดียว
  • ผู้ใช้อื่น ๆ สามารถ อ่าน ได้อย่างเดียว


ความรู้เรื่องเลขฐาน 2 ที่เรียนมาตั้งแต่สมัยมัธยมกลับมามีประโยชน์ (T_T)
เรียนมาตั้งนานเพิ่งจะเห็นประโยชน์จริงจังก็คราวนี้
จะสังเกตได้ว่าเรื่อง Files / Directory permission ที่กล่าวไปใช้เลขฐาน 2 ดังนี้

สิทธิ์ เลขฐาน 10 เลขฐาน 2
ไม่มีสิทธิ์อะไรใด ๆ เลย 0 0000 0000
Execute 1 0000 0001
Write 2 0000 0010
Read 4 0000 0100


ตอนนี้พอจะเห็นเริ่มเห็นไอเดียการไปใช้งานกันแล้วใช่ไหมครับ
บทความหน้าผมจะมาเขียนเรื่อง Bitwise Operator ต่อให้ครับ


Link: Bitwise C# [2/3] Bitwise Operator
Link: Bitwise C# [3/3] Apply Bitwise