我可以通过更好的数组操作来优化此代码吗?

标签 c arrays optimization arduino-uno

我有一个特定大小的字节数组。我想捕获它的最后四个字节并将它们并排放置以在一个变量中形成一个四字节的十六进制值。这样我就可以将一个四字节的 CRC-32 值与我的变量进行比较,并检查 CRC 值是否相同。 现在这就是我现在这样做的方式:

static unsigned long whole_four = 0; // This variable holds the last four bytes of the  received bytes which are the CRC bytes

//Note that "MAX_INPUT" is the size of my array and "data" is just a pointer I have used as an argument to a function to point to the elements a buffer array.

whole_four = ((unsigned long)(*(data+(MAX_INPUT-4)))<< 24)  | ((unsigned long)(*(data+(MAX_INPUT-3)))<< 16) | ((unsigned long)(*(data+(MAX_INPUT-2)))<< 8) | ((unsigned long)(*(data+(MAX_INPUT-1))));

如您所见,我正在对数组的最后四个元素进行移位和“或”运算,以生成一个四字节变量。 现在,我的问题是: 有没有更快的方法来实现这一目标并减少所需的处理能力? 我还想提一下,我正在 Arduino Uno 上编译这段代码。 非常感谢任何帮助或提示。

最佳答案

如果字节顺序不是问题(正如 Yves 所说如果要比较的两个 CRC 以相同的方式获得),您可以尝试:

memcpy(&whole_four, data + MAX_INPUT - 4, sizeof(whole_four));

考虑到数据类型对齐(char 数组不一定具有正确对齐)/处理器,现代编译器会将此调用内联到非常适合您的情况的内容。

PS memcpy 将使用主机系统字节顺序(小端)解释 data 的字节,而您的方法解释来自 data 的字节> 按大端顺序。

所以 memcpy 只有在你能以相同的格式获得另一个比较项时才会起作用。

关于我可以通过更好的数组操作来优化此代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22803170/

相关文章:

algorithm - 获得超过 2 个目标的帕累托前沿

php - 优化 sql 查询 PHP Phalcon

javascript - 在 html 代码中使用多个 jquery 和 javascript

c - 使用 __m512 intel 内在函数得到一个可以理解的错误

c - long 和 char[] 的 union ,字节顺序

java - 仅使用第一个实例 java 分割字符串

arrays - 我可以动态引用数组来执行数学函数吗?

arrays - 将目录中文件的 MD5 与数组进行比较 (perl)

c++ - 指向普通变量的常量指针

c - 查看这个中缀到后缀的转换