বাইনরি সংখ্যা গুণ করার জন্য গ্রেড-স্কুল অ্যালগরিদম (শিফট-অ্যান্ড-অ্যাড) ব্যবহার করা হয়। প্রতিটি বিট চেক করে যদি ১ হয় তবে প্রথম সংখ্যাকে শিফট করে যোগ করা হয়।
আলগরিদম: শিফট-অ্যান্ড-অ্যাড
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+)