将两个8位阵列组合为一个USHORT(16位),无环路
Combining two 8-Bit array to a USHORT (16 Bit) , without loop
我需要将两个UCHAR
(8位)数组组合成C中的USHORT
(16位)值。但我必须在不使用"for"或任何循环的情况下完成此操作。
作为:
UCHAR A[1000], B[1000];
USHORT C[1000];
结果必须为:
C[0] = {A[0], B[0]};
C[1] = {A[1], B[1]};
...
C[1000]={A[1000], B[1000]};
uint8_t one = 0xBA;
uint8_t two = 0xBE;
uint16_t both = one << 8 | two;
更新:也许我没有理解你的问题。。。但是如果您想将uint8_t数组转换为uint16_t数组->检查大小并投射
uint8_t array[100];
uint16_t array_ptr_ushort* =(uint16_t*)&array[0];
请确保阵列的大小均匀。
更新2:
uint8_t array1[100];
uint8_t array2[100];
uint16_t combined[100];
memcpy(combined, array1, sizeof(array1))
memcpy((uint8_t*)combined + sizeof(array1), array2, sizeof(array2))
更新3:
如果没有某种循环,你不能将两个数组组合在一个连续数组中,即使你使用DMA,循环也会存在于底层硬件中。。。
更新4:
你可以递归地做。
#include "stdafx.h"
#include <cstdint>
#include <algorithm>
uint8_t arrayA[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
uint8_t arrayB[] = {0xA, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1};
uint16_t array_combined[sizeof(arrayA)] = {};
static_assert(sizeof(arrayA) == sizeof(arrayB), "Arrays of different sizes");
uint16_t combine(const uint8_t *a, const uint8_t *b, uint16_t *put, uint32_t size)
{
uint16_t value = (*a << 8) | *b;
if(size)
*put = combine(++a, ++b, ++put, --size);
return value;
}
void combine_arrays(const uint8_t *a, const uint8_t *b, uint16_t *put, uint32_t size)
{
*put = combine(a, b, put, size);
}
int _tmain(int argc, _TCHAR* argv[])
{
combine_arrays(arrayA, arrayB, array_combined, sizeof(arrayA));
return 0;
}
更新5:来自C++的带有static_assert的C版本
#include <stdint.h>
uint8_t array1[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
uint8_t array2[] = {0xA, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1};
uint16_t array_combined[sizeof(array1)] = {};
static_assert(sizeof(array1) == sizeof(array2), "Arrays of different sizes");
int _tmain(int argc, _TCHAR* argv[])
{
int size = sizeof(array1);
int count = 0;
do
{
array_combined[count] = (array2[count] << 8) | array1[count];
}while(count++ != size);
return 0;
}
更新6:还有C++方法可以实现这一点。。。
ushortVal = ( ucharVal[0] << 8 ) | ucharVal[1];
对于单个元素,您只需将第一个字节向左移位8位,然后使用按位或添加第二个字节:
C[i] = (A[i] << 8) | B[i];
但对于阵列,您基本上希望将两个阵列"分散"到第三个阵列中,如下所示:
A[0] B[0] | A[1] B[1] | A[2] B[2] | ... | A[n-1] B[n-1]
C[0] | C[1] | C[2] | ... | C[n-1]
这意味着,如果阵列C
的第一个元素存储在地址0
处,则来自阵列A
的元素应该在地址0、16、32、48…处,并且来自阵列B
的元素在地址8、24、…处。。。如果不使用任何循环,就无法完成IMHO
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '