【发布时间】:2020-07-03 01:42:42
【问题描述】:
我正在编写一个执行大量操作的应用程序,并且我正在尝试尽可能多地进行优化。
我试图将除法 (31 / sum) 放在 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;
}
谢谢。
【问题讨论】:
-
这不是无效的吗?
unsigned char test = 555;在大多数机器上char是 1 个字节。我也没有看到任何循环。你能展示更多的代码吗? -
31 / sum即31 / 1234始终是0。 -
看来是有效的。正如我上面写的那样,该程序是给我的。它必须返回与原始值相同的值。
-
你想达到什么目的?给我们看一个现实的例子。您的示例值不适合无符号字符,因此我们在这里处理的不是 1234 和 555,而是值 43 和 210。如果我们假设整数,
test2的值在两种情况下是不同的。 -
unsigned sum = ua + ub + uc + ud + 1; sum /= 31; unsigned_char_array_a[i] = ua / sum;更接近。需要深思。