|
@@ -0,0 +1,279 @@
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.Linq;
|
|
|
+using System.Text;
|
|
|
+using System.Threading.Tasks;
|
|
|
+using System.Windows;
|
|
|
+
|
|
|
+namespace CalculatorBin
|
|
|
+{
|
|
|
+ internal class Bin : Object
|
|
|
+ {
|
|
|
+ string value;
|
|
|
+
|
|
|
+ public Bin(string value)
|
|
|
+ {
|
|
|
+ this.value = value;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ void LengthOfNumbers(string num1, string num2)
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // сложение в двоичной системе
|
|
|
+ public static Bin operator +(Bin num1, Bin num2)
|
|
|
+ {
|
|
|
+ string res = "";
|
|
|
+ string temp = "0";
|
|
|
+ int length = 0;
|
|
|
+
|
|
|
+ // знаки (положительное или отрицательное)
|
|
|
+ bool minus = false;
|
|
|
+ bool nll = false;
|
|
|
+
|
|
|
+ // если оба числа отрицательные
|
|
|
+ if (num1.value[0] == '-' && num2.value[0] == '-')
|
|
|
+ {
|
|
|
+ minus = true;
|
|
|
+ num1.value = num1.value.Substring(1);
|
|
|
+ num2.value = num2.value.Substring(1);
|
|
|
+ }
|
|
|
+ // если числа с разными знаками
|
|
|
+ else if ((num1.value[0] == '-' && num2.value[0] != '-') ||
|
|
|
+ (num1.value[0] != '-' && num2.value[0] == '-'))
|
|
|
+ {
|
|
|
+ if (num1.value[0] == '-')
|
|
|
+ num1.value = num1.value.Substring(1);
|
|
|
+ else if (num2.value[0] == '-')
|
|
|
+ num2.value = num2.value.Substring(1);
|
|
|
+ nll = true;
|
|
|
+ //TODO сделать если числа с разными знаками, тут вычитание
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // смотрим на длину
|
|
|
+ if (num1.value.Length == num2.value.Length)
|
|
|
+ {
|
|
|
+ length = num1.value.Length;
|
|
|
+ // смотрим, какое число больше по модулю
|
|
|
+ int j = 0;
|
|
|
+ for (int i = 0; i < length - 1; i++)
|
|
|
+ {
|
|
|
+ if (num1.value[i] != num2.value[i])
|
|
|
+ {
|
|
|
+ if (num1.value[i] == 1)
|
|
|
+ // первое число больше по модулю, ничего не меняем
|
|
|
+ break;
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // второе число больше по модулю, меняем числа местами
|
|
|
+ string boof = num1.value;
|
|
|
+ num1.value = num2.value;
|
|
|
+ num2.value = boof;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ j++;
|
|
|
+ }
|
|
|
+ if (j == length - 1)
|
|
|
+ {
|
|
|
+ // числа одинаковые
|
|
|
+ // если они с разными знаками
|
|
|
+ if (nll)
|
|
|
+ {
|
|
|
+ // то ответ сразу нуль
|
|
|
+ res = "0";
|
|
|
+ return new Bin(res);
|
|
|
+ }
|
|
|
+ // если они с одинаковыми знаками, то ничего не меняем
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (num1.value.Length > num2.value.Length)
|
|
|
+ {
|
|
|
+ length = num1.value.Length;
|
|
|
+ for (int i = 0; i <= num1.value.Length - num2.value.Length + 1; i++)
|
|
|
+ {
|
|
|
+ num2.value = num2.value.Insert(0, "0");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (num1.value.Length < num2.value.Length)
|
|
|
+ {
|
|
|
+ length = num2.value.Length;
|
|
|
+ for (int i = 0; i < num2.value.Length - num1.value.Length; i++)
|
|
|
+ {
|
|
|
+ num1.value = num1.value.Insert(0, "0");
|
|
|
+ }
|
|
|
+ // меняем числа местами, чтобы первым было большее по модулю
|
|
|
+ string boof = num1.value;
|
|
|
+ num1.value = num2.value;
|
|
|
+ num2.value = boof;
|
|
|
+ }
|
|
|
+
|
|
|
+ // складываем
|
|
|
+ for (int i = length - 1; i >= 0; i--)
|
|
|
+ {
|
|
|
+ if (temp == "0")
|
|
|
+ {
|
|
|
+ if ((num1.value[i] == '0' && num2.value[i] == '1') ||
|
|
|
+ (num1.value[i] == '1' && num2.value[i] == '0'))
|
|
|
+ {
|
|
|
+ res = res.Insert(0, "1");
|
|
|
+ }
|
|
|
+ else if (num1.value[i] == '0' && num2.value[i] == '0')
|
|
|
+ {
|
|
|
+ res = res.Insert(0, "0");
|
|
|
+ }
|
|
|
+ else if (num1.value[i] == '1' && num2.value[i] == '1')
|
|
|
+ {
|
|
|
+ res = res.Insert(0, "0");
|
|
|
+ temp = "1";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if ((num1.value[i] == '0' && num2.value[i] == '1') ||
|
|
|
+ (num1.value[i] == '1' && num2.value[i] == '0'))
|
|
|
+ {
|
|
|
+ res = res.Insert(0, "0");
|
|
|
+ }
|
|
|
+ else if (num1.value[i] == '0' && num2.value[i] == '0')
|
|
|
+ {
|
|
|
+ res = res.Insert(0, "1");
|
|
|
+ temp = "0";
|
|
|
+ }
|
|
|
+ else if (num1.value[i] == '1' && num2.value[i] == '1')
|
|
|
+ {
|
|
|
+ res = res.Insert(0, "1");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (temp == "1")
|
|
|
+ res = res.Insert(0, "1");
|
|
|
+
|
|
|
+ if (minus)
|
|
|
+ res = res.Insert(0, "-");
|
|
|
+
|
|
|
+ return new Bin(res);
|
|
|
+ }
|
|
|
+
|
|
|
+ // вычитание в двоичной системе
|
|
|
+ public static Bin operator -(Bin num1, Bin num2)
|
|
|
+ {
|
|
|
+ string res = "";
|
|
|
+ string temp = "0";
|
|
|
+ int length = 0;
|
|
|
+
|
|
|
+ // смотрим на длину чисел
|
|
|
+ if (num1.value.Length > num2.value.Length)
|
|
|
+ {
|
|
|
+ length = num1.value.Length;
|
|
|
+ //первое число длиннее, дописываем ко второму нули
|
|
|
+ for (int i = 0; i <= num1.value.Length - num2.value.Length + 1; i++)
|
|
|
+ {
|
|
|
+ num2.value = num2.value.Insert(0, "0");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (num1.value.Length < num2.value.Length)
|
|
|
+ {
|
|
|
+ length = num2.value.Length;
|
|
|
+ //второе число длиннее, дописываем к первому нули
|
|
|
+ for (int i = 0; i < num2.value.Length - num1.value.Length; i++)
|
|
|
+ {
|
|
|
+ num1.value = num1.value.Insert(0, "0");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else //числа одинаковой длины
|
|
|
+ length = num2.value.Length;
|
|
|
+
|
|
|
+ // в вычитаемом числе меняем цифры
|
|
|
+ string num3 = "";
|
|
|
+ for (int i = 0; i < length - 1; i++)
|
|
|
+ {
|
|
|
+ if (num2.value[i] == '0')
|
|
|
+ num3 = num3.Insert(0, "1");
|
|
|
+ else if (num2.value[i] == '1')
|
|
|
+ num3 = num3.Insert(0, "0");
|
|
|
+ }
|
|
|
+
|
|
|
+ // прибавляем к третьему числу единицу
|
|
|
+ string num4 = "1";
|
|
|
+ string num5 = "";
|
|
|
+ for (int i = 0; i < length - 1; i++)
|
|
|
+ {
|
|
|
+ num4 = num4.Insert(0, "0");
|
|
|
+ }
|
|
|
+ for (int i = length - 1; i >= 0; i--)
|
|
|
+ {
|
|
|
+ if (temp == "0")
|
|
|
+ {
|
|
|
+ if ((num3[i] == '0' && num4[i] == '1') ||
|
|
|
+ (num3[i] == '1' && num4[i] == '0'))
|
|
|
+ {
|
|
|
+ num5 = num5.Insert(0, "1");
|
|
|
+ }
|
|
|
+ else if (num3[i] == '0' && num4[i] == '0')
|
|
|
+ {
|
|
|
+ num5 = num5.Insert(0, "0");
|
|
|
+ }
|
|
|
+ else if (num3[i] == '1' && num4[i] == '1')
|
|
|
+ {
|
|
|
+ num5 = num5.Insert(0, "0");
|
|
|
+ temp = "1";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if ((num3[i] == '0' && num4[i] == '1') ||
|
|
|
+ (num3[i] == '1' && num4[i] == '0'))
|
|
|
+ {
|
|
|
+ num5 = num5.Insert(0, "0");
|
|
|
+ }
|
|
|
+ else if (num3[i] == '0' && num4[i] == '0')
|
|
|
+ {
|
|
|
+ num5 = num5.Insert(0, "1");
|
|
|
+ temp = "0";
|
|
|
+ }
|
|
|
+ else if (num3[i] == '1' && num4[i] == '1')
|
|
|
+ {
|
|
|
+ num5 = num5.Insert(0, "1");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (temp == "1")
|
|
|
+ num5 = num5.Insert(0, "1");
|
|
|
+
|
|
|
+ // складываем первое число и последнее
|
|
|
+
|
|
|
+
|
|
|
+ return new Bin(res);
|
|
|
+ }
|
|
|
+
|
|
|
+ // умножение в двоичной системе
|
|
|
+ public static Bin operator *(Bin num1, Bin num2)
|
|
|
+ {
|
|
|
+ string newNum = "";
|
|
|
+ for (int i = 7; i >= 0; i--)
|
|
|
+ {
|
|
|
+ if ((num1.value[i] == '0' && num2.value[i] == '1') ||
|
|
|
+ (num1.value[i] == '1' && num2.value[i] == '0') ||
|
|
|
+ (num1.value[i] == '0' && num2.value[i] == '0'))
|
|
|
+ {
|
|
|
+ newNum = newNum.Insert(0, "0");
|
|
|
+ }
|
|
|
+ else if (num1.value[i] == '1' && num2.value[i] == '1')
|
|
|
+ {
|
|
|
+ newNum = newNum.Insert(0, "1");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return new Bin(newNum);
|
|
|
+ }
|
|
|
+
|
|
|
+ public override string ToString()
|
|
|
+ {
|
|
|
+ return value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|