Bitwise Operator ในภาษา C#

Bitwise Operator ในภาษา C#
Bitwise Operator (ตัวดำเนินการระดับบิต) คือเครื่องหมายที่ใช้สำหรับ จัดการข้อมูลในระดับบิต (bit) ของค่าจำนวนเต็ม (int, long, byte, ฯลฯ) โดยตรง

ในภาษา C#, ทุกค่าตัวเลขถูกเก็บในรูปแบบของ “เลขฐานสอง” ซึ่งประกอบด้วยบิต (0 หรือ 1) และ Bitwise Operator จะช่วยให้เราสามารถควบคุมหรือเปลี่ยนแปลงบิตเหล่านั้นได้โดยตรง

พูดง่าย ๆ คือ Bitwise Operator ช่วยให้เราสามารถ “เปิด/ปิด/ตรวจสอบ” สถานะบิตแต่ละตัวภายในค่าตัวเลขได้

Bitwise Operator มักถูกใช้ในงานที่ต้องการประสิทธิภาพสูง เช่น

  • การควบคุมฮาร์ดแวร์ (Hardware Control)
  • การเข้ารหัสข้อมูล (Encryption)
  • การจัดการ Permission หรือ Flag
  • การเขียนเกม และการบีบอัดข้อมูล (Compression)

ประเภทของ Bitwise Operator ในภาษา C#

ในภาษา C# มี Bitwise Operator หลักอยู่ 6 ตัว ดังนี้

ตัวดำเนินการชื่อ (Operator Name)คำอธิบายตัวอย่างผลลัพธ์ (เมื่อ a = 5, b = 3)
&Bitwise ANDคืนค่า 1 เมื่อบิตของทั้งสองตัวเป็น 1a & b1
|Bitwise ORคืนค่า 1 เมื่อบิตของอย่างน้อยหนึ่งตัวเป็น 1a | b7
^Bitwise XORคืนค่า 1 เมื่อบิตของทั้งสองต่างกันa ^ b6
~Bitwise NOTกลับค่าบิตทั้งหมด (0 → 1, 1 → 0)~a-6
<<Left Shiftเลื่อนบิตไปทางซ้ายตามจำนวนที่ระบุa << 110
>>Right Shiftเลื่อนบิตไปทางขวาตามจำนวนที่ระบุa >> 12

ตัวอย่างการคำนวณแบบ Binary

ก่อนเข้าใจตัวดำเนินการ เรามาดูตัวเลขในรูปแบบฐานสองก่อน

a = 5 → 0101
b = 3 → 0011

เมื่อทำการคำนวณแบบ Bitwise จะเปรียบเทียบ “แต่ละบิต” ของทั้งสองค่า

Bitwise AND (&)

ตัวดำเนินการ & จะคืนค่า 1 ก็ต่อเมื่อบิตของทั้งสองค่ามีค่าเป็น 1 ทั้งคู่

C#
int a = 5;  // 0101
int b = 3;  // 0011
int result = a & b;
Console.WriteLine(result);
0101 (a)
0011 (b)
-----
0001 → ผลลัพธ์คือ 1

ใช้เมื่อต้องการ “ตรวจสอบสถานะบิต” ว่ามีบิตใดเปิดอยู่บ้าง

Bitwise OR (|)

ตัวดำเนินการ | จะคืนค่า 1 เมื่อมีบิตใดบิตหนึ่งเป็น 1

C#
int a = 5;  // 0101
int b = 3;  // 0011
int result = a | b;
Console.WriteLine(result);
0101
0011
-----
0111 → ผลลัพธ์คือ 7

ใช้เมื่อต้องการ “รวมสถานะบิต” เช่น การเปิดหลาย permission พร้อมกัน

Bitwise XOR (^)

ตัวดำเนินการ ^ (Exclusive OR) จะคืนค่า 1 เฉพาะเมื่อบิตทั้งสองต่างกัน

C#
int a = 5;  // 0101
int b = 3;  // 0011
int result = a ^ b;
Console.WriteLine(result);
0101
0011
-----
0110 → ผลลัพธ์คือ 6

ใช้ในงานเข้ารหัส (Encryption/Decryption) เพราะสามารถ “กลับบิต” ได้ด้วยตัวเองซ้ำสองครั้งจะคืนค่าต้นฉบับ

Bitwise NOT (~)

ตัวดำเนินการ ~ ใช้ “กลับค่าบิตทั้งหมด” (0 → 1, 1 → 0)

C#
int a = 5;   // 0000 0101
int result = ~a;
Console.WriteLine(result);
0000 0101 → 1111 1010 (ในระบบ signed integer = -6)

หมายเหตุ: ใน C# ใช้ระบบ Two’s Complement สำหรับตัวเลขลบ ดังนั้นผลลัพธ์จะเป็นค่าลบ

Left Shift (<<)

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

C#
int a = 5;  // 0101
int result = a << 1;
Console.WriteLine(result);
0101 << 1 → 1010 → ผลลัพธ์คือ 10

ใช้เมื่อต้องการ “คูณค่าด้วย 2” ต่อครั้ง เช่น a << 3 เท่ากับ a * 8

Right Shift (>>)

เลื่อนบิตทั้งหมดไปทางขวาตามจำนวนที่ระบุ บิตที่หลุดทางขวาจะหายไป

C#
int a = 10; // 1010
int result = a >> 1;
Console.WriteLine(result);
1010 >> 1 → 0101 → ผลลัพธ์คือ 5

ใช้เมื่อต้องการ “หารค่าด้วย 2” ต่อครั้ง เช่น a >> 2 เท่ากับ a / 4

การใช้ Bitwise Operator ในการจัดการ Permission

Bitwise Operator มักใช้ในระบบที่ต้องกำหนด “สิทธิ์” หรือ “สถานะ” หลายอย่างในค่าตัวเลขเดียว

C#
const int READ = 1;   // 0001
const int WRITE = 2;  // 0010
const int EXEC = 4;   // 0100

int permission = READ | WRITE;  // รวมสิทธิ์อ่านและเขียน

// ตรวจสอบสิทธิ์
bool canWrite = (permission & WRITE) == WRITE;
Console.WriteLine($"มีสิทธิ์เขียนหรือไม่: {canWrite}");
  • READ, WRITE, EXEC ถูกแทนด้วยค่าบิตที่แตกต่างกัน
  • | ใช้รวมสิทธิ์หลายอย่างไว้ในตัวแปรเดียว
  • & ใช้ตรวจสอบว่ามีสิทธิ์นั้นอยู่หรือไม่

เทคนิคนี้ใช้กันทั่วไปในระบบปฏิบัติการ, การจัดการไฟล์, และเกมเอนจิ้น

ข้อควรระวังในการใช้ Bitwise Operator

  1. ใช้ได้เฉพาะกับชนิดข้อมูลเลขจำนวนเต็ม (int, long, byte, short) เท่านั้น
  2. ผลลัพธ์อาจเป็นค่าลบ เมื่อใช้กับ ~ เพราะระบบเก็บค่าลบแบบ Two’s Complement
  3. อย่าสับสนกับ Logical Operators (&&, ||, !) Bitwise ทำงานที่ระดับบิต แต่ Logical ทำงานที่ระดับ boolean

Bitwise Operator คือเครื่องมือที่ทรงพลังสำหรับการจัดการข้อมูลในระดับบิตในภาษา C#
แม้ว่าจะไม่ค่อยถูกใช้ในงานทั่วไป แต่ในงานเฉพาะทาง เช่น การเขียนเกม, การเข้ารหัส, และการทำงานกับฮาร์ดแวร์ Bitwise Operator ช่วยให้โปรแกรมทำงานได้รวดเร็วและมีประสิทธิภาพมากขึ้น

แชร์เรื่องนี้