0

有没有办法将数组转换为整数,我有以下方法,但它似乎不起作用:

int8_t x_array[18] = {0,1,1,0,1,0,1,0,1,0,1,0,0,0,0,0,1,1};
int32_t numb;

for (int8_t j=0;j<19;j++)
{
   numb = numb + pow(2, i)*x_array[i];
}

是否有一个原因??

PS:这是我发布的上一个问题的后续问题 Joining outputs from switch 我已经编辑了这个问题,说明为什么建议的方法不起作用。

本质上,我想做的是在 RAPIDILITTE(一个模拟器软件)中创建一个程序,以每毫秒对 PS 输入(接近传感器系统)进行采样,这是 18 位数字输入。输入由位于端口 2 上的拨动开关 0-17(18 位)表示。输入需要在 0-9999 之间进行归一化)

主要问题是(我在之前发布的问题中提到过)我一次只能访问一个引脚,而不是一次读取整个端口。我尝试了很多方法来读取引脚并将它们组合成一个变量,将其转换为自然数,然后对输入进行规范化。最后,我认为最好的方法是将读取的每个引脚放入 a 中array[18],然后将其转换为变量,然后对其进行规范化。

4

3 回答 3

3

你永远不会初始化你的变量,所以读取它是简单的未定义行为。你应该说:

int32_t numb = 0;

您还应该决定是要i还是j作为循环变量。

(每次计算功率也很浪费;相反,您应该保持一个正在运行的乘数,并在每一步将其加倍。)

于 2012-08-30T05:57:12.837 回答
1

numb永远不会被初始化。您还遍历了数组中的最后一个元素(j < 19应该是j< 18)。此外,您从未声明i... 看来您的意思是j.

我相信您正在尝试将位数组转换为单个int32_t. 大概该数组是按重要性升序排列的,即从最低有效位到最高有效位。

int8_t x_array[18] = { 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1 };
int32_t numb = 0;
for (int8_t j = 0; j < 18; ++j) {
  numb |= x_array[j] << j;
}

你不需要在pow这里使用,因为pow(2, j)它相当于1 << j.

于 2012-08-30T06:17:18.310 回答
0

正如其他人提到的那样,您的问题是您没有初始化 numb 并导致您的程序未定义的行为。
另外,您的循环计数器需要更改为,i而不是j

我只是想为您的程序添加另一项修改,这就是您计算最终结果的方式。这个怎么样 ?它需要更少的操作来得到答案:

numb = 0;
for (int8_t i=LEN;i>0;i--)
    numb = numb*2 + x_array[i-1];
于 2012-08-30T07:14:27.637 回答