【问题标题】:Pointer memory address to binary conversion in C?指针内存地址到C中的二进制转换?
【发布时间】:2019-02-16 16:56:45
【问题描述】:

我正在尝试从第一原理实现快速傅立叶变换。这样做的第一步是将输入数据重新排序为可以应用基数 2 蝶形算法的特定序列。这个特定的序列是通过数组位置的位反转来实现的,如下图所示:

我想这样做的方法是,给定一个真实采样数据的数组,创建一个引用数组第一个位置的指针。然后使用该指针将数据数组的第一个位置的内存地址转换为二进制数,对其执行位反转,转换回十六进制并将新数组的第一个位置设置为等于取消引用的值“位反转”内存地址。在循环中执行此操作,我将能够每次都增加原始指针,计算出“反转”地址并以正确的顺序填充新数组。

我有两个问题:

  1. 这是一种很好的编程习惯吗?我知道设置指向特定地址的指针是不受欢迎的,但我认为数组在启动时分配在内存中,所以应该没问题。

  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 位置,你可以用这个索引来寻址你的数组。

标签: c embedded fft


【解决方案1】:

对于 FFT,您不希望对地址指针进行位反转(可能未与 FFT 长度的合适边界对齐),您希望对从零开始的数组索引进行位反转(有时实现在 C 中作为访问数组的指针偏移量)。

非常常见的是,置换是在“原地”完成的,其中使用原始索引和位索引索引交换数组的元素(使用临时变量),而不是复制到新数组,这需要更多内存(更大的数据缓存占用空间等)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多