পূর্বের আর্টিকেলের মতোই, কিন্তু এখানে আলাদা মেথড (`displaySum`) না ব্যবহার করে `Main` মেথডের ভিতরেই লজিক লিখা হয়েছে। এটি বেগিনার লেভেলের জন্য সহজ কিন্তু রিয়usable নয়।
ইনলাইন লজিক (Main-এ সরাসরি)
using System;
class Demo
{
public static void Main(string[] args)
{
long val1 = 11010; // বাইনরি ১১০১০ = ডেসিমেল ২৬
long val2 = 10100; // বাইনরি ১০১০০ = ডেসিমেল ২০
Console.WriteLine($"বাইনরি এক: {val1}");
Console.WriteLine($"বাইনরি দুই: {val2}");
long i = 0, rem = 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--;
Console.Write("যোগফল (বাইনরি): ");
while (i >= 0)
Console.Write(sum[i--]);
Console.WriteLine();
}
}
আউটপুট
বাইনরি এক: 11010
বাইনরি দুই: 10100
যোগফল (বাইনরি): 101110
যাচাই: ২৬ + ২০ = ৪৬, বাইনরি ১০১১১০ = ৩২+৮+৪+২ = ৪৬ ✓
কোড ব্যাখ্যা
- ইনপুট: দুটি লং ইন্টিজার যেগুলো বাইনরি ডিজিট হিসেবে ইন্টারপ্রেট করা হচ্ছে (১১০১০, ১০১০০)
- লুপ: `while (val1 != 0 || val2 != 0)` - যতক্ষণ না দুটোই শূন্য হয়
- বিট ক্যালকুলেশন: `(val1%10 + val2%10 + rem) % 2` - বাইনরি যোগ (০+০=০, ০+১=১, ১+১=০ ক্যারি ১)
- ক্যারি ক্যালকুলেশন: `(val1%10 + val2%10 + rem) / 2` - ইন্টিজার ডিভিশন দিয়ে ক্যারি (০ বা ১)
- শিফট: `val1 /= 10; val2 /= 10;` - পরবর্তী ডিজিটে যাওয়া
- রিভার্স আউটপুট: ফলাফল উল্টা ক্রমে স্টোর হয়েছে, তাই প্রিন্ট করার সময় রিভার্স করা হলো
- ইনপুট অবশ্যই বাইনরি ডিজিট (০/১) দিয়ে গঠিত লং ইন্টিজার হতে হবে
- লিডিং জিরো হ্যান্ডল করা হয় না (০০১১ → ১১)
- খুব বড় বাইনরি স্ট্রিং (৬৪ বিট+) এর জন্য স্ট্রিং-বেসড পদ্ধতি দরকার
- নেগেটিভ নম্বর সাপোর্ট নেই
- ইনলাইন লজিক: বেগিনারদের জন্য বোঝা সহজ, কিন্তু ডুপ্লিকেশন হয়
- মেথড এক্সট্রাকশন: DRY প্রিন্সিপল, রিয়usable, টেস্টযোগ্য
- বিটওয়াইজ: প্রোডাকশন কোডের জন্য সেরা (দ্রুত, সঠিক, স্ট্যান্ডার্ড)
- বাইনরি লিটারেল: `0b1010` সিনট্যাক্স ব্যবহার করুন পঠনযোগ্যতার জন্য
সীমাবদ্ধতা
উন্নত ভার্সন: ইনপুট ভ্যালিডেশনসহ
static long AddBinaryInline(long val1, long val2)
{
// ভ্যালিডেশন: শুধু ০ এবং ১ ডিজিট আছে কিনা
if (!IsBinary(val1) || !IsBinary(val2))
throw new ArgumentException("ইনপুট শুধু ০ এবং ১ ডিজিট হতে হবে");
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;
}
static bool IsBinary(long n)
{
if (n == 0) return true;
while (n > 0)
{
int digit = (int)(n % 10);
if (digit != 0 && digit != 1) return false;
n /= 10;
}
return true;
}
সেরা পদ্ধতি: বিটওয়াইজ (পুনরাবৃত্তি)
// সবচেয়ে দ্রুত এবং সঠিক - আসল বাইনরি অপারেশন
public static int AddBinaryBitwise(int a, int b)
{
while (b != 0)
{
int carry = a & b;
a = a ^ b;
b = carry << 1;
}
return a;
}
// বাইনরি লিটারেল ব্যবহার (C# 7.0+)
int a = 0b11010; // 26
int b = 0b10100; // 20
int sum = AddBinaryBitwise(a, b); // 46
Console.WriteLine(Convert.ToString(sum, 2)); // 101110