【发布时间】:2018-09-11 05:01:45
【问题描述】:
我在 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 验证2: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
-> 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 上运行。
感谢您提前提供帮助
PS:这是我的第一个 arduino 项目,所以它可能只是一个我找不到的愚蠢的小错误。
【问题讨论】:
-
据我所知,您的算法有点疯狂。您意识到程序中的数字已经转换为字节,对吧?你为什么这样做?
-
@markspace 我不知道我是否清楚我的算法:我有一个二进制数为 2 个字节大。我必须将每个字节单独存储在芯片上。在芯片上存储东西的功能需要一个应该存储的数字(1字节大小)。我的想法是将输入数字转换为二进制(2字节)并将每个字节转换为我可以存储在芯片上的数字。
-
你说的是哪个芯片(说真的,很重要)?你意识到如果你只是将一个 int 存储到内存中,字节会自动存储,对吧?
-
arduino nano 的 EEPROM 内存。问题是我一次只能存储一个字节,但是我的数字大于一个字节(2个字节)
-
1.
ints 是四个字节,所以请注意不要遇到溢出问题。 2. 通常,您将所有这些内容写入某种缓冲区,然后将缓冲区存储在 eeprom 中。一些 eeprom 具有必须同时重新编程的“页面”。
标签: java c algorithm arduino implementation