Перестановки массива C с помощью макросов

Можно ли сгенерировать конкретную перестановку массива с помощью макроса в 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);

И макромагия переместит все биты в новые правильные позиции.

6
задан Hunter McMillen 9 February 2012 в 03:06
поделиться