Нужен алгоритм сложения и умножения двоичных чисел - C#
Формулировка задачи:
Необходимо написать программу с описанием простейшего класса со следующими элементами: полями, конструкторами, свойствами.
Описать класс для работы со строкой, позволяющей хранить только двоичное число и выполнять с ним арифметические операции (минимум сложение и умножение). Предусмотреть инициализацию с проверкой допустимости значений. В случае недопустимых значений выбрасываются исключения.
Мне нужен алгоритм сложения и умножения двоичных чисел.
Перевод в десятичное число >> работа с десятичным числом >> перевод обратно в двоичное - такой вариант не подходит. Причем числа могут быть разной длины, например, 11011010101 и 1001011. Классы уже написал, ошибки, думаю, сложности не составят. Заранее благодарен.Решение задачи: «Нужен алгоритм сложения и умножения двоичных чисел»
textual
Листинг программы
using System;
using System.Collections;
using System.Linq;
namespace ConsoleApplication34
{
public class BinaryNumber
{
BitArray number;
public int Length { get { return number.Length; } }
public BitArray Bits { get { return (BitArray)number.Clone(); } }
public BinaryNumber(string value)
{
number = new BitArray(value.Select(x => x == '1').ToArray());
}
public BinaryNumber(BitArray value)
{
number = new BitArray(value);
}
public override string ToString()
{
var result = string.Empty;
for (int i = 0; i < number.Length; i++)
result += number[i] == true ? "1" : "0";
return result;
}
static BinaryNumber Equalize(BinaryNumber n1, int length)
{
if (n1.Bits.Length >= length) return n1;
var result = new BitArray(length);
var source = n1.Bits;
var offset = length - source.Length;
for (int i = length - 1; i >= offset; i--)
result[i] = source[i - offset];
return new BinaryNumber(result);
}
public static BinaryNumber operator +(BinaryNumber n1, BinaryNumber n2)
{
var n1Norm = Equalize(n1, n2.Length);
var n2Norm = Equalize(n2, n1.Length);
return new BinaryNumber(n1Norm.Bits.Or(n2Norm.Bits));
}
public static BinaryNumber operator *(BinaryNumber n1, BinaryNumber n2)
{
var n1Norm = Equalize(n1, n2.Length);
var n2Norm = Equalize(n2, n1.Length);
return new BinaryNumber(n1Norm.Bits.And(n2Norm.Bits));
}
}
class Program
{
static void Main(string[] args)
{
BinaryNumber n1 = new BinaryNumber("110101011");
BinaryNumber n2 = new BinaryNumber("1110111");
Console.WriteLine(n1 + n2);
Console.WriteLine(n1 * n2);
Console.ReadKey(true);
}
}
}