我有一些Java,它包含一个64行的块,如下所示:
x = ((some_long_bitwise_expression) << n |
(same_long_bitwise_expression) >>> (32 - n))
其中"长表达式"在每行中相同,但从一行变为下一行。通常,这将仅使用方法调用来计算表达式,然后单独执行位旋转。但我想知道是否可以优化这,从而消除 64 个方法调用。
那么有没有办法计算和保存表达式积,然后在 OR 的另一侧引用它?
如果我只是这样做:
int t;
x = ((t = (some_long_bitwise_expression)) << n |
(t) >>> (32 - n))
这实际上似乎有效。但它是合法的Java吗?
更新:
经过一些简单的性能测试,我发现对 64 行代码中的每一行使用 3 个不同方法调用中的 1 个实际上要快得多。
int t;
x = ((t = (some_long_bitwise_expression)) << n |
(t) >>> (32 - n))
当然,你可以做这种混淆,但它并不比
int t = some_long_bitwise_expression;
x = (t << n) | (t >>> (32 - n));
这更清楚。而且,最后一个表达式等效于
x = (t << n) | (t >>> -n);
因为整数的移位距离取模 32。所以你可以写
x = rotateLeft(some_long_bitwise_expression, n)
使用您自己的旋转方法,并具有非常易读的表达式。您甚至可以希望使用旋转组件指令对其进行优化,但事实并非如此。Oracle JVM优化
x = Integer.rotateLeft(some_long_bitwise_expression, n)
但不是你自己的方法。