我可以把这个分开吗?

问题描述 投票:-2回答:1

我正在编写一个执行大量操作的应用程序,并且我正在尝试尽可能多地优化。

我正在尝试将除法(31 /总和)放在test2之外,因为这样一来,我可以在一个循环中仅执行1次该操作,否则将完成3次。

unsigned sum = 1234;
unsigned char test = 555;
unsigned char test2 = test * 31 / sum;

目标是

unsigned sum = 1234;
unsigned char test = 555;
unsigned division = 31 / sum;
unsigned char test2 = test * division;

C中的实例(简体)示例:

for (int i = 0; i < N; i++)
    {
        unsigned a=0,b=0,c=0,d=0;
        int aux;

        for (int j = 0; j < M; j++)
        {
            aux = arr[j];
            if (conditions)
                a += aux;
            if (conditions)
                b += aux;
            if (conditions)
                c += aux;
            if (conditions)
                d += aux;
        }

        unsigned char ua = a, ub = b, uc = c, ud = d;
        unsigned sum = ua + ub + uc + ud + 1;
        unsigned_char_array_a[i] = ua * 31 / sum;
        unsigned_char_array_b[i] = ub * 31 / sum;
        unsigned_char_array_c[i] = uc * 31 / sum;
        unsigned_char_array_d[i] = ud * 31 / sum;
    }

谢谢。

c char integer unsigned
1个回答
0
投票

OP似乎想避免整数除法-一些(嵌入式)处理器的速度很慢-即使它们具有快速乘法。

  // 4 divisions.
  unsigned sum = ua + ub + uc + ud + 1;
  unsigned_char_array_a[i] = ua * 31 / sum;
  unsigned_char_array_b[i] = ub * 31 / sum;
  ...

给出sum的值将在[1-1021]范围内,代码可以进行缩放乘法,然后除以恒定的2的幂。好的编译器将实现简单的快速转换。使用32位int/unsigned

缩放比例为65536

  #define SCALE 65536u

  unsigned factor = (31 * SCALE)/sum;
  unsigned_char_array_a[i] = (ua * factor) / SCALE;
  unsigned_char_array_b[i] = (ub * factor) / SCALE;
  ...

未经测试的断言:我并不期望每次商均与(ua * 31) / sum;完全相同,但应在1以内。

© www.soinside.com 2019 - 2024. All rights reserved.