ทำไมเราต้องใช้ Bitwise
10 Jan 2020 00:00
Written by: Yosapol Jitrak
บทความนี้เป็นการนำบทความที่เคยเขียนเมื่อหลายปีมาแล้ว มาทำการ 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 |
---|---|---|
ไม่มีสิทธิ์อะไรใด ๆ เลย | 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