0

我正在做这个让大脑麻木的任务,我必须像这样简化 loooooong 表达式:

coef = ((((((((((inv_nrg >> 16) * (int)((short)nl)) + (((inv_nrg & 0x0000FFFF) * (int)((short)nl)) >> 16)))) + ((inv_nrg * ((16 == 1 ? (nl >> 1) + (nl & 1) : ((nl >> 15) + 1) >> 1)))))) >> 16) * (int)((short)(1024 << 1))) + ((((((((((inv_nrg >> 16) * (int)((short)nl)) + (((inv_nrg & 0x0000FFFF) * (int)((short)nl)) >> 16)))) + ((inv_nrg * ((16 == 1 ? (nl >> 1) + (nl & 1) : ((nl >> 15) + 1) >> 1)))))) & 0x0000FFFF) * (int)((short)(1024 << 1))) >> 16));
  }

一定有一个工具可以把上面的表达方式,咀嚼一下,吐出一个更干净,更简单的表达方式?

请帮帮我——我的大脑快麻木了!!!

4

1 回答 1

2

将其分解为多个部分(并让编译器担心对其进行优化)

例如,您可以分配inv_nrg >> 16给一个变量inv_nrg_high。一样inv_nrg & 0x0000ffff_inv_nrg_low

一些数字常量也可以简化——(1024 << 1) 可以替换为实际值。

那里也有一些“死”的表达式(16 == 1? stuff1 : stuff2 )可以替换为,stuff2因为 16 永远不等于 1。

我会让你做实际删除所有多余的括号并替换变量的驴工作。这是完全有可能的,我已经完成了大部分工作,只是为了看看它做了什么[对我来说毫无意义,但没关系]。

编辑:花了几分钟,我想出了这个:

int inv_nrg_high = inv_nrg >> 16;
int inv_nrg_low  = inv_nrg & 0xFFFF;
int nl_sh_p1_sh     = ((nl >> 15) + 1) >> 1;
int x = ((inv_nrg_high * nl)) + ((inv_nrg_low * nl)) >> 16;
int y = (x + inv_nrg * nl_sh_p1_sh);

coef = ((y >> 16) * 2048) + ((y & 0x0000FFFF) * 2048) >> 16);

[我不是 100% 确定它是正确的,但也不是那么遥远。

[它看起来像是来自 C 预处理器的东西,可能是一些复杂的定点数学或类似的结果]

于 2013-01-29T18:35:11.497 回答