ภาพรวม
ใน C# สามารถคูณตัวเลขด้วย 2 ได้อย่างรวดเร็วโดยใช้ Bitwise Left Shift Operator (<<) การเลื่อนบิตไปทางซ้าย 1 ตำแหน่ง (<< 1) เทียบเท่ากับการคูณด้วย 2^n โดยที่ n = จำนวนตำแหน่งที่เลื่อน วิธีนี้มีประสิทธิภาพสูงกว่าการคูณทั่วไปในระดับฮาร์ดแวร์
หลักการทำงาน
ในระบบเลขฐานสอง (Binary) การเลื่อนบิตไปทางซ้าย 1 ตำแหน่ง จะทำให้ค่าเพิ่มขึ้น 2 เท่า:
25 (ฐานสิบ) = 0001 1001 (ฐานสอง) 25 << 1 = 0011 0010 (ฐานสอง) = 50 (ฐานสิบ)
ตัวอย่างโปรแกรม
using System;
namespace BitwiseDemo
{
class Example
{
static void Main(string[] args)
{
int num = 25, result;
// คูณด้วย 2 โดยใช้ Left Shift 1 ตำแหน่ง
result = num << 1;
Console.WriteLine("ตัวเลขต้นฉบับ: {0}", num);
Console.WriteLine("ตัวเลขคูณ 2: {0}", result);
}
}
}ผลลัพธ์
ตัวเลขต้นฉบับ: 25 ตัวเลขคูณ 2: 50
การประยุกต์ใช้: คูณด้วย 2^n
| การดำเนินการ | Bitwise | เทียบเท่าทางคณิตศาสตร์ |
|---|---|---|
| คูณ 2 | x × 2¹ | |
| คูณ 4 | x × 2² | |
| คูณ 8 | x × 2³ | |
| คูณ 16 | x × 2⁴ | |
| หาร 2 (ปัดลง) | x ÷ 2¹ | |
| หาร 4 (ปัดลง) | x ÷ 2² |
ตัวอย่างเพิ่มเติม: การหารด้วย 2
using System;
public class Demo
{
public static void Main()
{
int num = 50;
Console.WriteLine("ต้นฉบับ: {0}", num);
Console.WriteLine("คูณ 2: {0}", num << 1); // 100
Console.WriteLine("คูณ 4: {0}", num << 2); // 200
Console.WriteLine("คูณ 8: {0}", num << 3); // 400
Console.WriteLine("หาร 2: {0}", num >> 1); // 25
Console.WriteLine("หาร 4: {0}", num >> 2); // 12 (ปัดลง)
}
}ข้อสังเกตสำคัญ
- ทำงานได้กับจำนวนเต็มลบด้วย (Two's complement representation)
- ระวัง Overflow: การเลื่อนบิตอาจทำให้สูญเสียบิตสำคัญ (sign bit) ได้
- คอมไพลอร์สมัยใหม่จะเพิ่มประสิทธิภาพ
x * 2ให้เป็นx << 1เองแล้ว (Strength Reduction Optimization) - อ่านง่ายกว่า: เขียน
x * 2ก็เพียงพอ ใช้ bitwise เฉพาะเมื่อจำเป็นต้องควบคุมระดับบิตโดยตรง - ใช้กับ
int,long,byte,shortและชนิด unsigned ได้ทั้งหมด