gpt4 book ai didi

C 数组排列与宏

转载 作者:太空狗 更新时间:2023-10-29 17:23:06 26 4
gpt4 key购买 nike

是否可以用 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 位 key ,在这个例子中可以是 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

因此位串中新的第一个元素将是原始位串中的第 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);

宏魔术会将所有位移动到新的正确位置。

最佳答案

当然 - 您的示例就快完成了。试试这个:

 #define S_2Permute(x) {x[5], x[3], x[4], x[2], x[1]}

然后:

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

要记住两件事:

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

#define S_2Permute(x) {x[4], x[2], x[3], x[1], x[0]}

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");
}

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

关于C 数组排列与宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9204707/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com