算法在Java中工作,但在C中不工作

时间:2018-04-01 23:10:59

标签: java c algorithm arduino implementation

我在Java中有一个算法的实现,但我在C中实现的算法不起作用。 该算法采用一个数字并将其转换为2字节二进制。 然后它再次将两个字节分别转换为数字,然后返回给用户。

Java实现:

public class Test
{
public static void main(String[] args)
{
    int bytes[] = new int[16];
    int vals[] = getVals(2000, bytes);

    System.out.println(vals[0]);
    System.out.println(vals[1]);
}

public static int[] getVals(int val, int bytes[]) {

      for(int i = 0; i < 16; i++) {

        if(val - Math.pow(2, 15-i) >= 0) {

          val -= Math.pow(2, 15-i);
          bytes[i] = 1; 


        }else bytes[i] = 0;

      }

      int val1 = 0;
      for(int i = 0; i < 8; i++) {
        System.out.print(bytes[i]);
        System.out.print(": ");
        System.out.println(Math.pow(2, 7-i) * bytes[i]);
        val1 += Math.pow(2, 7-i) * bytes[i];

      }

      int val2 = 0;
      for(int i = 8; i < 16; i++) {
        System.out.print(bytes[i]);
        System.out.print(": ");
        System.out.println(Math.pow(2, 7-(i-8)) * bytes[i]);
        val2 += Math.pow(2, 7-(i-8)) * bytes[i];

      }
      int []vals = {val1, val2};

      return vals;
    }
}

输出Java代码: val1:7 val2:208 哪些是正确的输出(我自己计算它们来检查它们)

在C中实现Arduino(不起作用):

#include <math.h>
int vals[2]; 
int bytes[16];
void setup() {

  Serial.begin(9600);
  getVals(2000);
  for(int i = 0; i < 16; i++) Serial.print(bytes[i]);
  Serial.println(" ");
  Serial.println(vals[0]);
  Serial.println(vals[1]);

}

void loop() {
  // put your main code here, to run repeatedly:

}

void getVals(int val) {

  for(int i = 0; i < 16; i++) {

    if(val - pow(2, 15-i) >= 0) {

      val -= pow(2, 15-i);
      bytes[i] = 1; 


    }else bytes[i] = 0;

  }

  int val1 = 0;
  for(int i = 0; i < 8; i++) {
    Serial.print(bytes[i]);
    Serial.print(": ");
    Serial.println(pow(2, 7-i) * bytes[i]);
    val1 += pow(2, 7-i) * bytes[i];

  }

  int val2 = 0;
  for(int i = 8; i < 16; i++) {
    Serial.print(bytes[i]);
    Serial.print(": ");
    Serial.println(pow(2, 7-(i-8)) * bytes[i]);
    val2 += pow(2, 7-(i-8)) * bytes[i];

  }
  Serial.println(val1);
  Serial.println(val2);
  vals[0] = val1;
  vals[1] = val2;

}

C代码的输出: val1:6 val2:206

- &GT;完整输出C代码: 0:0.00
0:0.00
0:0.00
0:0.00
0:0.00
1:4.00
1:2.00
1:1.00
1:128.00
1:64.00
0:0.00
1:16.00
0:0.00
0:0.00
0:0.00
0:0.00
6
206个
0000011111010000
6
206

有人可以指出C实现有什么问题吗? 可悲的是我不能在Java中使用算法因为我需要它在arduino上运行。

Thx提前帮助

PS:这是我的第一个arduino项目所以它可能只是一个我找不到的愚蠢的小错误。

2 个答案:

答案 0 :(得分:2)

我会继续在这里给出答案,这是一种更简单的方法,可能更容易在C中工作。

public class ConvertToBytes {
   public static void main( String[] args ) {
      final int i = 2000;
      System.out.println( "Low byte:" + (i & 0xFF) );
      System.out.println( "High byte:" + (i>>8 & 0xFF) );
   }
}

输出:

run:
Low byte:208
High byte:7
BUILD SUCCESSFUL (total time: 2 seconds)

答案 1 :(得分:0)

您的C代码是正确的(在我的电脑上它会给出您期望的结果)。您的输出似乎还可以:除以2个字节并检查自己。

0: 0.00
0: 0.00
0: 0.00
0: 0.00
0: 0.00
1: 4.00
1: 2.00
1: 1.00

1: 128.00
1: 64.00
0: 0.00
1: 16.00
0: 0.00
0: 0.00
0: 0.00
0: 0.00

重新运行并重新检查arduino的结果。如果错误仍然存​​在,则可能取决于平台。

我能想到的一点是,int变量可能是16位,因此可能存在求和/减去2 ^ 15的问题。我认为不是你的情况,而是使用unsigned int类型或long类型。