Jitrak Blog

วงแหวนเว็บ

Bitwise C# [1/3] Why to Bitwise

January 10, 2020

บทความนี้เป็นการนำบทความที่เคยเขียนเมื่อหลายปีมาแล้ว มาทำการ Repost ใหม่

เมื่อหลายปีที่แล้ว สมัยที่ผมยังทำตำแหน่ง Game Developer อยู่
ทีมได้โจทย์ ให้ทำเกมผสมสี มีสีดังนี้

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

ซึ่งสีขาวนั้นเป็นสีเริ่มแรก เป็นสีที่ยังไม่ได้เทสีอะไรลงไป มีสีแดง, น้ำเงิน, เหลือง เป็นแม่สี
และสีมีม่วง, ส้ม, และเขียว เป็นสีที่เกิดจากการผสมแม่สีสองสีเข้าด้วยกัน
ตอนแรกก็อยากจะเขียนเป็นการผสมสีด้วย 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 ที่เรียนมาตั้งแต่สมัยมัธยมกลับมามีประโยชน์ (ㅠ_ㅠ)
เรียนมาตั้งนานเพิ่งจะเห็นประโยชน์จริงจังก็คราวนี้
จะสังเกตได้ว่าเรื่อง 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


Written by Yosapol Jitrak, Who is interested in game development, FinTech, technology, agile and DevOps culture. Follow me on Facebook