简化looooong表达式。有什么工具吗?

时间:2013-01-29 18:17:56

标签: c formatting

我正在研究这个大脑麻木的任务,我必须简化像这样的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));
  }

必须有一个工具可以采用上面的表达方式,咀嚼它并吐出一个更干净简单的表达方式吗?

请帮助我 - 我的大脑麻木了!

1 个答案:

答案 0 :(得分:2)

将其细分为部分(并让编译器担心优化它)

例如,您可以将inv_nrg >> 16分配给变量inv_nrg_highinv_nrg & 0x0000ffffinv_nrg_low

相同

一些数字常数也可以简化 - (1024 <&lt; 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预处理器的soemthing,可能是一些复杂的定点数学或类似的结果]