我正在研究这个大脑麻木的任务,我必须简化像这样的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));
}
必须有一个工具可以采用上面的表达方式,咀嚼它并吐出一个更干净简单的表达方式吗?
请帮助我 - 我的大脑麻木了!
答案 0 :(得分:2)
将其细分为部分(并让编译器担心优化它)
例如,您可以将inv_nrg >> 16
分配给变量inv_nrg_high
。 inv_nrg & 0x0000ffff
与inv_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,可能是一些复杂的定点数学或类似的结果]