我在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项目所以它可能只是一个我找不到的愚蠢的小错误。答案 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类型。