Можно ли сгенерировать конкретную перестановку массива с помощью макроса в C?
т.е. Если у меня есть массив X с элементами:
0 1 2 3 4 5
x = ["0","1","1","0","1","0"]
Я подумал, что может быть какой-то макрос foo для чего-то вроде этого:
#define S_2Permute(x) = [x[5], x[3], x[4], x[2], x[1]]
где я переопределяю порядок массива, поэтому элемент в исходной позиции 5 теперь находится в позиции 0.
Есть идеи?
ПРИМЕР ИСПОЛЬЗОВАНИЯ
Я начинаю создавать реализацию алгоритма шифрования DES. DES требует нескольких перестановок / расширений, при этом мне пришлось бы переупорядочить все элементы в массиве, иногда сжимая массив, а иногда расширяя его. Я надеялся просто определить макрос для перестановки массивов за меня.
EDIT2
Итак, в DES первый шаг - это то, что называется начальной перестановкой. Итак, изначально у меня есть какой-то 64-битный ключ, который в этом примере может быть 0-15 шестнадцатеричный:
0123456789ABCDEF
, который расширяется до:
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
IP (начальная перестановка) переставляет эту строку так, чтобы каждый элемент в массиве был в новой позиции:
IP =
58 50 42 34 26 18 10 2
60 52 44 36 28 20 12 4
62 54 46 38 30 22 14 6
64 56 48 40 32 24 16 8
57 49 41 33 25 17 9 1
59 51 43 35 27 19 11 3
61 53 45 37 29 21 13 5
63 55 47 39 31 23 15 7
Таким образом, новый 1-й элемент в цепочке битов будет 58-м элементом (битом) из исходной цепочки битов.
Итак, я хотел бы сохранить все эти биты в массиве символов:
x = [0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,0,0,1,0,1,0,1,1,0,0,
1,1,1,1,0,0,0,1,0,0,1,1,0,1,0,1,0,1,1,1,1,0,0,1,1,0,1,1,1,1,0,1,1,1,1]
, а затем просто вызвать
IP_PERMUTE(x);
И макромагия переместит все биты в новые правильные позиции.