有一个类似于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;
}