Создать класс для работы с двоичными числами реализовать в нем операцию сложения, умножения, вычитания - C#
Формулировка задачи:
создать класс для работы с двоичными числами реализовать в нем операцию сложения умнежения вычитания
Решение задачи: «Создать класс для работы с двоичными числами реализовать в нем операцию сложения, умножения, вычитания»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
namespace ConsoleApplication157
{
class Program
{
public static void Main(string[] args)
{
var n1 = new Bin("1011");
var n2 = new Bin("1101");
Console.WriteLine(n1 + n2);
Console.WriteLine(n2 - n1);
Console.WriteLine(n1 * n2);
Console.ReadLine();
}
}
/// <summary>
/// Binary number
/// </summary>
class Bin
{
/// <summary>
/// Bits of number, from lower to higher
/// </summary>
private List<int> bits = new List<int>();
Bin()
{
}
public Bin(string str)
{
foreach (var c in str.Reverse())
bits.Add(c=='1' ? 1 : 0);
}
public Bin Clone()
{
return new Bin() {bits = new List<int>(bits)};
}
public int this[int index]
{
get { return index >= bits.Count ? 0 : bits[index]; }
}
public int Length { get { return bits.Count; } }
/// <summary>
/// Shifts number left (equal mult by 2^shift)
/// </summary>
public static Bin operator <<(Bin n, int shift)
{
var res = n.Clone();
res.bits.InsertRange(0, new int[shift]);
return res;
}
/// <summary>
/// Shifts number right (equal div by 2^shift)
/// </summary>
public static Bin operator >>(Bin n, int shift)
{
var res = n.Clone();
res.bits.RemoveRange(0, shift);
return res;
}
/// <summary>
/// Sum of binary numbers
/// </summary>
public static Bin operator +(Bin n1, Bin n2)
{
var c = Math.Max(n1.Length, n2.Length);
var rest = 0;
var res = new Bin();
for(int i=0;i<c;i++)
{
var n = n1[i] + n2[i] + rest;
rest = n >> 1;
res.bits.Add(n & 0x01);
}
if (rest > 0)
res.bits.Add(1);
return res;
}
/// <summary>
/// Diff of binary numbers
/// </summary>
public static Bin operator -(Bin n1, Bin n2)
{
var c = Math.Max(n1.Length, n2.Length);
var rest = 0;
var res = new Bin();
for (int i = 0; i < c; i++)
{
var n = n1[i] - n2[i] - rest;
rest = n < 0 ? 1 : 0;
res.bits.Add(n < 0 ? 1 : n);
}
if (rest > 0)
throw new Exception("Result less 0");
return res;
}
/// <summary>
/// Mult of binary numbers
/// </summary>
public static Bin operator *(Bin n1, Bin n2)
{
var res = new Bin();
for (int i = 0; i < n2.Length; i++)
{
if (n2[i] == 1)
res = res + n1;
n1 = n1 << 1;
}
return res;
}
public override string ToString()
{
var sb = new StringBuilder();
for (int i = Length - 1; i >= 0; i--)
sb.Append(bits[i] == 1 ? '1' : '0');
return sb.ToString().TrimStart('0');
}
}
}