Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

วิธีคูณเลขด้วย 2 ด้วย Bitwise Operator ใน C#

ภาพรวม

ใน 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

x << 1x << 2x << 3x << 4x >> 1x >> 2
การดำเนินการBitwiseเทียบเท่าทางคณิตศาสตร์
คูณ 2x × 2¹
คูณ 4x × 2²
คูณ 8x × 2³
คูณ 16x × 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 ได้ทั้งหมด