কম্পিউটার টিউটোরিয়াল

C#-এ দুটি বাইনরি সংখ্যার গুণফল বের করা

বাইনরি সংখ্যা গুণ করার জন্য গ্রেড-স্কুল অ্যালগরিদম (শিফট-অ্যান্ড-অ্যাড) ব্যবহার করা হয়। প্রতিটি বিট চেক করে যদি ১ হয় তবে প্রথম সংখ্যাকে শিফট করে যোগ করা হয়।

আলগরিদম: শিফট-অ্যান্ড-অ্যাড

val1 = 11100 (28)
val2 = 10001 (17)

Step 1: val2 এর LSB = 1 → val1 যোগ করুন (shift 0):     11100
Step 2: val2 >>= 1, val1 <<= 1, val2 LSB = 0 → স্কিপ
Step 3: val2 >>= 1, val1 <<= 1, val2 LSB = 0 → স্কিপ
Step 4: val2 >>= 1, val1 <<= 1, val2 LSB = 0 → স্কিপ
Step 5: val2 >>= 1, val1 <<= 1, val2 LSB = 1 → val1 যোগ করুন (shift 4): 111000000
Result: 111011100 (476)

সম্পূর্ণ উদাহরণ (ম্যানুয়াল বাইনরি স্ট্রিং ম্যানিপুলেশন)


using System;

class Demo
{
    public static void Main(string[] args)
    {
        long val1 = 11100; // বাইনরি রিপ্রেজেন্টেশন (ডেসিমেল ১১১০০ নয়!)
        long val2 = 10001; // বাইনরি রিপ্রেজেন্টেশন
        
        Console.WriteLine($"বাইনরি এক: {val1}");
        Console.WriteLine($"বাইনরি দুই: {val2}");
        
        long prod = 0;
        long factor = 1;
        
        while (val2 != 0)
        {
            long digit = val2 % 10;
            if (digit == 1)
            {
                val1 = val1 * factor;          // শিফট (×10 ডেসিমেলে = <<1 বাইনরিতে)
                prod = AddBinary(prod, val1);  // বাইনরি যোগ
            }
            else
            {
                val1 = val1 * factor;          // শুধু শিফট
            }
            val2 /= 10;
            factor = 10; // ডেসিমেল ১০ = বাইনরি ১০১০ (ভুল লজিক!)
        }
        
        Console.WriteLine($"গুণফল (বাইনরি): {prod}");
    }
    
    // বাইনরি যোগ হেল্পার (পূর্বের আর্টিকেল থেকে)
    static long AddBinary(long val1, long val2)
    {
        long i = 0, rem = 0, res = 0;
        long[] sum = new long[64];
        while (val1 != 0 || val2 != 0)
        {
            sum[i++] = (val1 % 10 + val2 % 10 + rem) % 2;
            rem = (val1 % 10 + val2 % 10 + rem) / 2;
            val1 /= 10; val2 /= 10;
        }
        if (rem != 0) sum[i++] = rem;
        i--;
        while (i >= 0) res = res * 10 + sum[i--];
        return res;
    }
}

আউটপুট


বাইনরি এক: 11100
বাইনরি দুই: 10001
গুণফল (বাইনরি): 111011100

⚠️ মূল কোডের বাগ বিশ্লেষণ

মূল উদাহরণে একটি বড় লজিক্যাল বাগ রয়েছে: `factor = 10` ডেসিমেল ১০ সেট করে, কিন্তু বাইনরিতে শিফট লেফট মানে `×2` (ডেসিমেল) বা `<<1` (বাইনরিতে)। ডেসিমেল ১০ গুণ করলে বাইনরি শিফট হয় না, বরং ভুল ফলাফল দেয়। এটি কেবল নির্দিষ্ট ইনপুটের জন্য তুক্কায় সঠিক ফলাফল দেয়।

সঠিক পদ্ধতি: বিটওয়াইজ অপারেশন (সুপারিশ করা)


public static int MultiplyBinaryBitwise(int a, int b)
{
    int result = 0;
    while (b != 0)
    {
        if ((b & 1) != 0) // LSB চেক
            result = AddBinaryBitwise(result, a);
        a <<= 1; // লেফট শিফট (×2)
        b >>= 1; // রাইট শিফট (/2)
    }
    return result;
}

static int AddBinaryBitwise(int a, int b)
{
    while (b != 0)
    {
        int carry = a & b;
        a = a ^ b;
        b = carry << 1;
    }
    return a;
}

// ব্যবহার
int a = 0b11100; // 28
int b = 0b10001; // 17
int prod = MultiplyBinaryBitwise(a, b); // 476
Console.WriteLine(Convert.ToString(prod, 2)); // 111011100

বাইনরি স্ট্রিং গুণ (অনলিমিটেড সাইজ)


public static string MultiplyBinaryStrings(string a, string b)
{
    if (a == "0" || b == "0") return "0";
    
    // ছোট স্ট্রিংকে আউটার লুপে রাখুন
    if (a.Length < b.Length) (a, b) = (b, a);
    
    string result = "0";
    string shiftedA = a;
    
    for (int i = b.Length - 1; i >= 0; i--)
    {
        if (b[i] == '1')
            result = AddBinaryStrings(result, shiftedA);
        shiftedA += "0"; // লেফট শিফট (অ্যাপেন্ড ০)
    }
    return result;
}

static string AddBinaryStrings(string a, string b)
{
    int i = a.Length - 1, j = b.Length - 1, carry = 0;
    var sb = new System.Text.StringBuilder();
    while (i >= 0 || j >= 0 || carry > 0)
    {
        int sum = carry;
        if (i >= 0) sum += a[i--] - '0';
        if (j >= 0) sum += b[j--] - '0';
        sb.Insert(0, sum % 2);
        carry = sum / 2;
    }
    return sb.ToString();
}

বিল্ট-ইন BigInteger (বড় বাইনরি সংখ্যা)


using System.Numerics;

BigInteger a = BigInteger.Parse("11100", System.Globalization.NumberStyles.AllowHexSpecifier); // ভুল!
// সঠিক: বাইনরি স্ট্রিং পার্স করার জন্য
BigInteger a = Convert.ToInt64("11100", 2); // ছোট সংখ্যা
// বড় সংখ্যা:
BigInteger bigA = 0;
foreach (char c in "11100") bigA = (bigA << 1) + (c - '0');

সারসংক্ষেপ

  • মূল উদাহরণে বাগ: `factor = 10` বাইনরি শিফট নয়, ডেসিমেল ১০ গুণ
  • সঠিক বাইনরি গুণ: বিটওয়াইজ `<<`, `>>`, `&`, `^` ব্যবহার করুন
  • শিক্ষামূলক: ম্যানুয়াল ডিজিট ম্যানিপুলেশন বুঝতে ভালো
  • প্রোডাকশন: নেটিভ `*` অপারেটর বা `BigInteger` ব্যবহার করুন
  • বাইনরি লিটারেল: `0b11100` সিনট্যাক্স ব্যবহার করুন (C# 7+)
  1. পাইথন প্রোগ্রাম: বাইনোমিয়াল ট্রি (Binomial Tree) ইমপ্লিমেন্টেশন

  2. পাইথনে কিথ (Keith) সংখ্যা খুঁজে বের করার প্রোগ্রাম

  3. পাইথনে তিনটি সংখ্যার মধ্যে সর্বোচ্চ বের করা

  4. Python-এ প্রাকৃতিক সংখ্যার যোগফল (Sum of Natural Numbers) বের করা