我有一些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种不同的方法调用中的一种实际上要快得多。
答案 0 :(得分:0)
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)
使用您自己的rotate方法,并具有非常易读的表达式。您甚至可以希望通过旋转装配指令对其进行优化,但事实并非如此。 Oracle JVM优化
x = Integer.rotateLeft(some_long_bitwise_expression, n)
但不是您自己的方法。