Jitrak Blog

Bitwise C# [1/3] Why to Bitwise

ทำไมเราต้องใช้ Bitwise

10 Jan 2020 00:00

Written by: Yosapol Jitrak

Tags:

CSharp

Bitwise

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

644 จึงหมายถึง

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

สิทธิ์เลขฐาน 10เลขฐาน 2
ไม่มีสิทธิ์อะไรใด ๆ เลย00000 0000
Execute10000 0001
Write20000 0010
Read40000 0100

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


บทความหน้าผมจะมาเขียนเรื่อง Bitwise Operator ต่อให้ครับ
Link: Bitwise C# [2/3] Bitwise Operator
Link: Bitwise C# [3/3] Apply Bitwise