【发布时间】:2019-02-16 16:56:45
【问题描述】:
我正在尝试从第一原理实现快速傅立叶变换。这样做的第一步是将输入数据重新排序为可以应用基数 2 蝶形算法的特定序列。这个特定的序列是通过数组位置的位反转来实现的,如下图所示:
我想这样做的方法是,给定一个真实采样数据的数组,创建一个引用数组第一个位置的指针。然后使用该指针将数据数组的第一个位置的内存地址转换为二进制数,对其执行位反转,转换回十六进制并将新数组的第一个位置设置为等于取消引用的值“位反转”内存地址。在循环中执行此操作,我将能够每次都增加原始指针,计算出“反转”地址并以正确的顺序填充新数组。
我有两个问题:
这是一种很好的编程习惯吗?我知道设置指向特定地址的指针是不受欢迎的,但我认为数组在启动时分配在内存中,所以应该没问题。
-
如何使用 C 语言将指针值转换为二进制值?我想到了这样的事情:
int sampledData [8]; int * 指针 = 样本; int hex_address = (int)pointer;
【问题讨论】:
-
在一个数组上计算一个地址在 C 中并不是前所未有的;事实上,通常的数组寻址实际上就是这样做的。但是,我不确定您为什么要将地址用作实际值。
-
@RobertHarvey 唯一的原因是能够将该实际地址转换为二进制值,以便我可以将其反转以获得所需的顺序。
-
您必须考虑数组的索引,而不是其中一个元素的内存地址。数组的索引从零开始;数组元素的内存地址没有。
-
回想一下,C 中的 指针 不是数组元素的索引;它是一个指向任意内存地址的指针。
-
正如罗伯特哈维所说,必须对索引进行位反转。所以
int sampledData [8]; int * pointer = samples; int hex_address = (int)pointer;不是好方法。你确实需要not来操作指针。计算 bit_reverse 有许多棘手的算法,但首先,更简单的是定义一个表并使用它来进行位反转。int rev={0,4,2,6,1,5,3,7};然后你提取数组索引的 3 LSB,计算rev[i]并将其写回 LSB 位置,你可以用这个索引来寻址你的数组。