ภาพรวม
บวกเลขฐานสองโดยจัดการเป็นตัวเลข decimal ที่ประกอบด้วยตัวเลข 0 และ 1 เท่านั้น แล้วทำการบวกแบบ manual digit-by-digit พร้อม carry
โค้ดตัวอย่าง
using System;
class Demo {
public static void Main() {
long val1 = 11110; // binary representation as decimal number
long val2 = 11100;
Console.WriteLine($"Binary one: {val1}");
Console.WriteLine($"Binary two: {val2}");
long sum = AddBinary(val1, val2);
Console.WriteLine($"Sum = {sum}");
}
static long AddBinary(long val1, long val2) {
long i = 0, rem = 0, res = 0;
long[] sum = new long[64]; // รองรับ 64 bits
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;
// สร้างผลลัพธ์ (reverse array)
i--;
while (i >= 0) {
res = res * 10 + sum[i--];
}
return res;
}
}
ผลลัพธ์
Binary one: 11110
Binary two: 11100
Sum = 111010
ตรวจสอบความถูกต้อง
- 11110₂ = 30₁₀
- 11100₂ = 28₁₀
- 30 + 28 = 58₁₀
- 111010₂ = 32+16+8+2 = 58₁₀ ✓
วิธีที่ทันสมัยและถูกต้องกว่า: ใช้ Convert.ToString/Convert.ToInt32
static string AddBinaryProper(string bin1, string bin2) {
// แปลง binary string เป็น int
int n1 = Convert.ToInt32(bin1, 2);
int n2 = Convert.ToInt32(bin2, 2);
// บวกใน decimal
int sum = n1 + n2;
// แปลงกลับเป็น binary string
return Convert.ToString(sum, 2);
}
// ใช้งาน
string result = AddBinaryProper("11110", "11100");
Console.WriteLine(result); // 111010
สำหรับเลขใหญ่: ใช้ BigInteger
using System.Numerics;
static string AddBinaryBig(string bin1, string bin2) {
BigInteger n1 = 0, n2 = 0;
foreach (char c in bin1) { n1 = n1 * 2 + (c - '0'); }
foreach (char c in bin2) { n2 = n2 * 2 + (c - '0'); }
BigInteger sum = n1 + n2;
// แปลงกลับ binary
if (sum == 0) return "0";
string result = "";
while (sum > 0) {
result = (sum % 2) + result;
sum /= 2;
}
return result;
}
สรุป
- วิธี manual digit-by-digit: เข้าใจหลักการ แต่ error-prone และจำกัดขนาด
- ใช้
Convert.ToInt32(str, 2)และConvert.ToString(num, 2)สำหรับกรณีทั่วไป - ใช้
BigIntegerสำหรับเลขฐานสองขนาดใหญ่ (มากกว่า 64 bits)