c-将一个8位数组乘以一个常数,并利用我们有一个32位微控制器的优势更快地缩减到8位



有一个类似于uint8_t a[8] = {1, 2, 3, 4, 5, 6, 7, 8};和常数c=100的数组。

我想这样做:

for(i = 0;i < 8; i++) {
a[i] = (a[i] * c) >> 8;
}

然而,由于它只有8位数据,我想知道是否有一种技巧可以用32位MCU一次相乘并缩放回8位以上的元素。(矢量运算中没有构建(

编辑:将单词";归一化";至";缩放到8位";

您可以一次将两个数组元素相乘,方法是为每个元素指定32位值的16位。

但是,只有保证每个a[i] * c不会溢出16位(即,如果代码中分配给a[i]的值不超过255(,这才会起作用。如果它确实溢出,那么由于进位被传播,一些值将偏离1。

我还假设c适合16位——如果不适合,那么您可以将其截断为16位,而不更改原始代码的结果。

for (i = 0; i < 8; i += 2) {
uint32_t x = (((uint32_t)a[i+1] << 16) | a[i]) * c;
a[i] = (x >> 8) & 0xFF;
a[i+1] = x >> 24;
}

最新更新