Leo223

efremovv

Feb 10th, 2022
795
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.22 KB | None | 0 0
  1. using System;
  2. using System.Linq;
  3.  
  4. namespace efremov
  5. {
  6.     class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             Console.Write("Enter A: ");
  11.             int A = int.Parse(Console.ReadLine());
  12.             Console.Write("Enter B: ");
  13.             int B = int.Parse(Console.ReadLine());
  14.  
  15.             Console.WriteLine("\t| Forward\t| Reverse\t| Additional\n" +
  16.                 "\t| \t\t| \t\t| \n" +
  17.                 $"A\t| {ToForward(A)}\t| {ToReverse(A)}\t| {ToAdditional(A)}\n" +
  18.                 $"B\t| {ToForward(B)}\t| {ToReverse(B)}\t| {ToAdditional(B)}\n" +
  19.                 $"-A\t| {ToForward(-A)}\t| {ToReverse(-A)}\t| {ToAdditional(-A)}\n" +
  20.                 $"-B\t| {ToForward(-B)}\t| {ToReverse(-B)}\t| {ToAdditional(-B)}\n" +
  21.                 $"---------------------------------------------------\n" +
  22.                 $"A * 2^-2| {ToShiftRightForForward(ToForward(A), 2)}\t| {ToShiftRightForReverse(ToReverse(A), 2)}\t| {ToShiftRightForAdditional(ToAdditional(A), 2)}\n" +
  23.                 $"A * 2^-3| {ToShiftRightForForward(ToForward(A), 3)}\t| {ToShiftRightForReverse(ToReverse(A), 3)}\t| {ToShiftRightForAdditional(ToAdditional(A), 3)}\n" +
  24.                 $"A * 2^3 | {ToShiftLeftForForward(ToForward(A), 3)}\t| {ToShiftLeftForReverse(ToReverse(A), 3)}\t| {ToShiftLeftForAdditional(ToAdditional(A), 3)}\n" +
  25.                 $"A * 2^4 | {ToShiftLeftForForward(ToForward(A), 4)}\t| {ToShiftLeftForReverse(ToReverse(A), 4)}\t| {ToShiftLeftForAdditional(ToAdditional(A), 4)}\n" +
  26.                 $"B * 2^-2| {ToShiftRightForForward(ToForward(B), 2)}\t| {ToShiftRightForReverse(ToReverse(B), 2)}\t| {ToShiftRightForAdditional(ToAdditional(B), 2)}\n" +
  27.                 $"B * 2^-3| {ToShiftRightForForward(ToForward(B), 3)}\t| {ToShiftRightForReverse(ToReverse(B), 3)}\t| {ToShiftRightForAdditional(ToAdditional(B), 3)}\n" +
  28.                 $"B * 2^3 | {ToShiftLeftForForward(ToForward(B), 3)}\t| {ToShiftLeftForReverse(ToReverse(B), 3)}\t| {ToShiftLeftForAdditional(ToAdditional(B), 3)}\n" +
  29.                 $"B * 2^4 | {ToShiftLeftForForward(ToForward(B), 4)}\t| {ToShiftLeftForReverse(ToReverse(B), 4)}\t| {ToShiftLeftForAdditional(ToAdditional(B), 4)}\n" +
  30.                 $"---------------------------------------------------\n" +
  31.                 $"A + B\t| {ToForward(A)}\t| {ToReverse(A)}\t| {ToAdditional(A)}\n" +
  32.                 $"\t|+ \t\t|+ \t\t|+\n" +
  33.                 $"\t| {ToForward(B)}\t| {ToReverse(B)}\t| {ToAdditional(B)}\n" +
  34.                 $"\t| ---------\t| ---------\t| ---------\n" +
  35.                 $"\t| {ToForward(A + B)}\t| {ToReverse(A + B)}\t| {ToAdditional(A + B)}\n" +
  36.                 $"---------------------------------------------------\n" +
  37.                 $"A - B\t| {ToForward(A)}\t| {ToReverse(A)}\t| {ToAdditional(A)}\n" +
  38.                 $"\t|+ \t\t|+ \t\t|+\n" +
  39.                 $"\t| {ToForward(-B)}\t| {ToReverse(-B)}\t| {ToAdditional(-B)}\n" +
  40.                 $"\t| ---------\t| ---------\t| ---------\n" +
  41.                 $"\t| {ToForward(A - B)}\t| {ToReverse(A - B)}\t| {ToAdditional(A - B)}\n" +
  42.                 $"---------------------------------------------------\n" +
  43.                 $"-A + B\t| {ToForward(-A)}\t| {ToReverse(-A)}\t| {ToAdditional(-A)}\n" +
  44.                 $"\t|+ \t\t|+ \t\t|+\n" +
  45.                 $"\t| {ToForward(B)}\t| {ToReverse(B)}\t| {ToAdditional(B)}\n" +
  46.                 $"\t| ---------\t| ---------\t| ---------\n" +
  47.                 $"\t| {ToForward(-A + B)}\t| {ToReverse(-A + B)}\t| {ToAdditional(-A + B)}\n" +
  48.                 $"---------------------------------------------------\n" +
  49.                 $"-A - B\t| { ToForward(-A)}\t| { ToReverse(-A)}\t| { ToAdditional(-A)}\n" +
  50.                 $"\t|+ \t\t|+ \t\t|+\n" +
  51.                 $"\t| {ToForward(-B)}\t| {ToReverse(-B)}\t| {ToAdditional(-B)}\n" +
  52.                 $"\t| ---------\t| ---------\t| ---------\n" +
  53.                 $"\t| {ToForward(-A + -B)}\t| {ToReverse(-A + -B)}\t| {ToAdditional(-A + -B)}\n" +
  54.                 $"---------------------------------------------------\n" +
  55.                 $"A * B\t| ");
  56.  
  57.             string[] rows = Multiply(A, B);
  58.  
  59.             for (int i = 0; i < rows.Length; ++i)
  60.             {
  61.                 if (i != 0)
  62.                     Console.Write("\t|  +\n");
  63.                 Console.WriteLine("\t|   " + rows[i]);
  64.             }
  65.  
  66.             Console.WriteLine("\t| ---------\n\t| " + ToForward(A * B));
  67.  
  68.             Console.Write("\nWrite any key to continue...");
  69.             Console.ReadKey();
  70.         }
  71.  
  72.         static string GetBinaryWithImaginary(string binary, bool hasSign)
  73.         {
  74.             string imaginary = new string('0', 7 - binary.Length);
  75.             return (hasSign) ? $"1.{imaginary}{binary}" : $"0.{imaginary}{binary}";
  76.         }
  77.  
  78.         static string ToForward(int digit)
  79.             => (digit >= 0) ? GetBinaryWithImaginary(Convert.ToString(digit, 2), false)
  80.                 : GetBinaryWithImaginary(Convert.ToString(Math.Abs(digit), 2), true);
  81.  
  82.         static string ToReverse(int digit)
  83.         {
  84.             if (digit >= 0)
  85.                 return GetBinaryWithImaginary(Convert.ToString(digit, 2), false);
  86.             else
  87.             {
  88.                 string binary = GetBinaryWithImaginary(Convert.ToString(Math.Abs(digit), 2), true);
  89.                 string[] leftAndRightParts = binary.Split('.');
  90.                 string reverseBinary = string.Empty;
  91.  
  92.                 foreach (char bit in leftAndRightParts[1])
  93.                     reverseBinary += (bit == '0') ? '1' : '0';
  94.  
  95.                 return $"1.{reverseBinary}";
  96.             }
  97.         }
  98.  
  99.         static string ToAdditional(int digit)
  100.         {
  101.             if (digit >= 0)
  102.                 return GetBinaryWithImaginary(Convert.ToString(digit, 2), false);
  103.             else
  104.             {
  105.                 string binary = GetBinaryWithImaginary(Convert.ToString(Math.Abs(digit), 2), true);
  106.                 string[] leftAndRightParts = binary.Split('.');
  107.                 string reverseBinary = string.Empty;
  108.  
  109.                 foreach (char bit in leftAndRightParts[1])
  110.                     reverseBinary += (bit == '0') ? '1' : '0';
  111.  
  112.                 digit = Convert.ToInt32(reverseBinary, 2) + 1;
  113.                 string additionalBinary = Convert.ToString(digit, 2);
  114.                 return GetBinaryWithImaginary(additionalBinary, true);
  115.             }
  116.         }
  117.  
  118.         static string ToShiftRightForForward(string binary, int move)
  119.         {
  120.             string[] leftAndRightParts = binary.Split('.');
  121.             return leftAndRightParts[0] + "." + new string('0', move) + leftAndRightParts[1].Substring(0, 7 - move);
  122.         }
  123.  
  124.         static string ToShiftRightForReverse(string binary, int move)
  125.         {
  126.             string[] leftAndRightParts = binary.Split('.');
  127.             return (leftAndRightParts[0] == "0") ? ToShiftRightForForward(binary, move)
  128.                 : leftAndRightParts[0] + "." + new string('1', move) + leftAndRightParts[1].Substring(0, 7 - move);
  129.         }
  130.  
  131.         static string ToShiftRightForAdditional(string binary, int move) => ToShiftRightForReverse(binary, move);
  132.  
  133.         static string ToShiftLeftForForward(string binary, int move)
  134.         {
  135.             string[] leftAndRightParts = binary.Split('.');
  136.  
  137.             string overflow = string.Empty;
  138.             if (leftAndRightParts[1].Substring(0, move).Contains('1'))
  139.                 overflow = " (o)";
  140.  
  141.             return leftAndRightParts[0] + "." + leftAndRightParts[1].Substring(move, 7 - move) + new string('0', move) + overflow;
  142.         }
  143.  
  144.         static string ToShiftLeftForReverse(string binary, int move)
  145.         {
  146.             string[] leftAndRightParts = binary.Split('.');
  147.  
  148.             if (leftAndRightParts[0] == "0")
  149.                 return ToShiftLeftForForward(binary, move);
  150.  
  151.             string overflow = string.Empty;
  152.             if (leftAndRightParts[1].Substring(0, move).Contains('0'))
  153.                 overflow = " (o)";
  154.  
  155.             return leftAndRightParts[0] + "." + leftAndRightParts[1].Substring(move, 7 - move) + new string('1', move) + overflow;
  156.         }
  157.  
  158.         static string ToShiftLeftForAdditional(string binary, int move)
  159.         {
  160.             string[] leftAndRightParts = binary.Split('.');
  161.  
  162.             if (leftAndRightParts[0] == "0")
  163.                 return ToShiftLeftForForward(binary, move);
  164.  
  165.             string overflow = string.Empty;
  166.             if (leftAndRightParts[1].Substring(0, move).Contains('0'))
  167.                 overflow = " (o)";
  168.  
  169.             return leftAndRightParts[0] + "." + leftAndRightParts[1].Substring(move, 7 - move) + new string('0', move) + overflow;
  170.         }
  171.  
  172.         static string[] Multiply(int A, int B)
  173.         {
  174.             string binaryA = Convert.ToString(A, 2);
  175.             string binaryB = Convert.ToString(B, 2);
  176.  
  177.             int maxLength = (binaryA.Length > binaryB.Length) ? binaryA.Length : binaryB.Length;
  178.  
  179.             string reverseBinaryB = new(binaryB.Reverse().ToArray());
  180.  
  181.             string[] rows = new string[maxLength];
  182.  
  183.             for (int i = 0; i < maxLength; ++i)
  184.                 rows[i] = (reverseBinaryB[i] == '1') ? new string(' ', maxLength - 1 - i) + binaryA
  185.                     : rows[i] = new string(' ', maxLength - i + 2) + '0';
  186.  
  187.             return rows;
  188.         }
  189.     }
  190. }
Advertisement
Add Comment
Please, Sign In to add comment