using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace testHexNum { class Program { // побитовое представление целого числа с сохранением в массив шестнадцатиразрядных комбинаций public static ushort[] numToBitArr(ushort inp) { ushort[] arr = new ushort[16]; arr[0] = (ushort)(inp & 1); int pow = 1; for (int i = 1; i < 16; i++) { pow = pow * 2; arr[i] = (ushort)(inp & pow); } return arr; } // перестановка битов public static ushort bitPermutation(ushort inp, int[] arr) { ushort result = 0; ushort[] saveInputArr = new ushort[16]; // массив, хранящий побитовое представление исходного числа ushort[] outputArr = new ushort[16]; // массив, хранящий побитовое представление результата перестановки битов исходного числа saveInputArr = numToBitArr(inp); // сохраняем исходное число до преобразования/перестановки // формируем результат функции поразрядно, используя побитовые операции сдвига и логического ИЛИ for (int i = 0; i < 16; i++) { // сдвиг для каждого бита производим влево или вправо, в зависимости от отображения бита исходного числа в бит результата, определяемого алгоритмом преобразования outputArr[i] = ((16 - arr[15 - i] - i) > 0) ? (ushort)(saveInputArr[16 - arr[15 - i]] >> (16 - arr[15 - i] - i)) : (ushort)(saveInputArr[16 - arr[15 - i]] << (-16 + arr[15 - i] + i)); result = (ushort)(result | outputArr[i]); } return result; } // проверка симметричности преобразования public static bool isSymmetric(ushort num, int[] arr) { return (num == bitPermutation(num, arr)); } // преобразование целого числа в строку его двоичного представления public static string BinaryToString(ushort num) { string result_str = ""; ushort num_mod = num; int power = 32768; // производим последовательное деление целого числа на очередную степень числа 2, в порядке убывания, используя остаток от деления для следующей операции деления for (int i = 16; i > 0; i--) { result_str = result_str + num_mod / power + '\t'; num_mod = (ushort)(num % power); power = power / 2; } return result_str; } static void Main(string[] args) { // рабочая переменная для хранения преобразуемого целого числа ushort num = 0; // массивы перестановок двоичных разрядов для заданных преобразований int[] algO1_0 = { 4, 3, 2, 1, 8, 7, 6, 5, 12, 11, 10, 9, 16, 15, 14, 13 }; int[] algO2_90 = { 13, 14, 15, 16, 9, 10, 11, 12, 5, 6, 7, 8, 1, 2, 3, 4 }; int[] algO3_45 = { 16, 12, 8, 4, 15, 11, 7, 3, 14, 10, 6, 2, 13, 9, 5, 1 }; int[] algO4_135 = { 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16 }; /* int[] algP1_90 = { 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16 }; */ int[] algP1_90 = { 13, 9, 5, 1, 14, 10, 6, 2, 15, 11, 7, 3, 16, 12, 8, 4 }; int[] algP1_180 = { 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; int[] algP1_270 = { 4, 8, 12, 16, 3, 7, 11, 15, 2, 6, 10, 14, 1, 5, 9, 13 }; // открываем текстовый файл для записи StreamWriter sw = new StreamWriter("output.txt"); // перебираем все целые числа в диапазоне от 0 до 65535 for (int n = 0; n <= 65535; n++) { num = (ushort)n; // проверку условия задачи проводим при помощи операции исключающее ИЛИ if (isSymmetric(num, algO1_0) || isSymmetric(num, algO2_90) || isSymmetric(num, algO3_45) || isSymmetric(num, algO4_135) || isSymmetric(num, algP1_90) || isSymmetric(num, algP1_180) || isSymmetric(num, algP1_270)) { sw.Write(BinaryToString(num)); // выводим в текстовый файл двоичное представление исходного числа sw.Write(Convert.ToString(num, 16).ToUpper()); sw.Write('\t'); // выводим шестнадцатеричное представление исходного числа // выводим шестнадцатеричные образы результатов преобразований sw.Write(Convert.ToString(bitPermutation(num, algP1_90), 16).ToUpper()); sw.Write('\t'); sw.Write(Convert.ToString(bitPermutation(num, algP1_180), 16).ToUpper()); sw.Write('\t'); sw.Write(Convert.ToString(bitPermutation(num, algP1_270), 16).ToUpper()); sw.Write('\t'); sw.Write(Convert.ToString(bitPermutation(num, algO1_0), 16).ToUpper()); sw.Write('\t'); sw.Write(Convert.ToString(bitPermutation(num, algO2_90), 16).ToUpper()); sw.Write('\t'); sw.Write(Convert.ToString(bitPermutation(num, algO3_45), 16).ToUpper()); sw.Write('\t'); sw.WriteLine(Convert.ToString(bitPermutation(num, algO4_135), 16).ToUpper()); } } // закрываем выходной поток, связанный с текстовым файлом sw.Close(); } } }