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_highinv_nrg & 0x0000ffffと同じinv_nrg_low

一部の数値定数は単純化することもできます - (1024 << 1) は実際の値に置き換えることができます。

16 は決して 1 に等しくないため、(16 == 1? stuff1 : stuff2 )置き換えることができる「死んだ」式もいくつかあります。stuff2

実際に不要な括弧をすべて削除し、変数を置き換えるという面倒な作業はあなたに任せます。それは完全に可能であり、私はそれが何をするかを確認するためだけに、ほとんどの方法で作業しました[私には意味がありませんが、気にしないでください].

編集:数分を費やして、私はこれを思いつきました:

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 に答える