是否可以使用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)
并且宏魔法会将所有位移动到新的正确位置.
绝对 - 你的例子已经差不多了。尝试这个:
#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
| 归档时间: |
|
| 查看次数: |
1129 次 |
| 最近记录: |