带有宏的C数组排列

Hun*_*len 6 c macros

是否可以使用C中的宏生成数组的特定排列?

即如果我有一个带有元素的数组X:

      0   1   2   3   4   5  
x = ["0","1","1","0","1","0"] 
Run Code Online (Sandbox Code Playgroud)

我在想可能会有类似这样的宏foo:

#define S_2Permute(x) = [x[5], x[3], x[4], x[2], x[1]]
Run Code Online (Sandbox Code Playgroud)

其中我重新定义了数组的顺序,因此原始位置5中的元素现在处于位置0.

有任何想法吗?

示例使用

我开始创建DES加密算法的实现.DES需要几个排列/扩展,我必须重新排序数组中的所有元素,有时缩小数组并有时扩展它.我希望能够为我定义一个宏来置换数组.

EDIT2

在DES中,第一步是称为初始置换.所以最初我有一些64位密钥,在这个例子中可以是0-15十六进制:

0123456789ABCDEF 
Run Code Online (Sandbox Code Playgroud)

扩展到:

0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

所以bitstring中的新1st元素将是原始bitstring中的第58个元素(bit).

所以我将所有这些位存储在一个字符数组中:

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]
Run Code Online (Sandbox Code Playgroud)

然后打电话

IP_PERMUTE(x);
Run Code Online (Sandbox Code Playgroud)

并且宏魔法会将所有位移动到新的正确位置.

Tim*_*nes 4

绝对 - 你的例子已经差不多了。尝试这个:

 #define S_2Permute(x) {x[5], x[3], x[4], x[2], x[1]}
Run Code Online (Sandbox Code Playgroud)

然后后来:

int x[] = {1,2,3,4,5,6};
int y[] = S_2Permute(x); // y is now {6,4,5,3,2}
Run Code Online (Sandbox Code Playgroud)

要记住两件事:

1)在C中,数组从0开始编号,所以你的意思可能是:

#define S_2Permute(x) {x[4], x[2], x[3], x[1], x[0]}
Run Code Online (Sandbox Code Playgroud)

2) 如果您使用 gcc,则可以使用 进行编译-E以查看预处理器的输出(非常适合调试宏扩展)。


然而,我不认为我实际上会这样做 - 我想说如果你以编程方式生成排列,代码会更容易阅读(并且可能更不容易出错) - 而且我怀疑这会是一个性能受到很大影响。


既然你说你在编译这个时遇到问题,那么这里有一个在 gcc 4.6.1 中适合我的测试程序:

#include <stdio.h>
#define S_2Permute(x) {x[5], x[3], x[4], x[2], x[1]}

int main(void) {
  int x[] = {1,2,3,4,5,6};
  int y[] = S_2Permute(x);

  for(int i = 0; i < 5; i++) {
    printf("%d,",y[i]);
  }
  printf("\n");
}
Run Code Online (Sandbox Code Playgroud)

我编译了gcc test.c -std=c99 -Wall