旋转代码优化(Java)



所以我有一段代码,它经常用来计算旋转状态。它有两个字节,每个字节的范围从0-3,对应于一个方向(0=左,1=下,2=右,3=上),产生一个字节,显示它在的旋转步骤(因此我们可以确定下一个循环到哪两个方向)。请注意,这两个字节不应该相等,但如果发生这种情况,则旋转值设置为-1。我知道位运算往往比分支运算更快,所以我用位运算来计算值。以下是我目前所拥有的:

byte rotation = -1;
if(con1!=con2){
    if((con1&0x1)==(con2&0x1))rotation=(byte) (4+(con1&0x1));
    else{
        rotation = (byte) ((con1^con2)>>1);
        rotation = (byte) (rotation | (rotation==0x0?con1&0x2:((con1<<1)^con2))&0x2);
    }
}

con1和con2是两个输入字节。rotation是旋转字节,对应于以下内容:

-1 = invalid input
 0 = (┐), left  and down  (a 0 and a 1)
 1 = (┌), down  and right (a 1 and a 2)
 2 = (└), right and up    (a 2 and a 3)
 3 = (┘), up    and left  (a 3 and a 0)
 4 = (─), left  and right (a 0 and a 2)
 5 = (│), down  and up    (a 1 and a 3)

现在的问题是,有人有更快的方法来计算这个吗?

有时,快速代码与干净代码和精简代码相反。

我认为您的表显示了所有有效的可能性,您将使用0<=input1/2<=3你心中的约束。

也许这个代码更快,我不确定:

    byte[] matrix = {
            -1, 0, -1, -1, //input1 = 0, input2 from 0 to 3
            -1, -1, 1, 5, //input1 = 1, input2 from 0 to 3
            -1, -1, -1, 2, //input1 = 2, input2 from 0 to 3
            3, -1, -1, -1 //input1 = 3, input2 from 0 to 3
    };
    byte input1 = 0;
    byte input2 = 1;
    byte result = matrix[input1 * 4 + input2];

使用这个实现,每次需要以正确的旋转方式转换输入时,只需要执行一行代码,可能会更快。

我认为如果编译器优化第一个,那么使用"*4"one_answers"<<2"可能是等效的。

首先,这是Java,它旨在独立于平台。除非您知道实现的细节,否则您无法真正谈论与位操作相比的分支速度。

第二,你说你试图避免分支,但你在那里放了三个分支(两个if语句和一个条件运算符…)

第三,你想做什么根本不清楚(例如,直觉上向左+向右和向上+向下都会导致"什么都不做",但你给了他们不同的结果),如果正确的做法可能是重新思考比你狭隘的问题更广泛的问题。

第四,当你处理比特运算时,有一个"不应该发生,但如果发生了,就分配这个值"会适得其反。如果你想要最大速度,你应该说"这不应该发生,所以如果发生了,那么任何值都是可以接受的"。

讲得够多了,如果你接受我在第四点的建议,那么下面的方法将在没有分支的情况下发挥作用:

result = con1 | ((con2 << 2) & (con2 << 1));

最新更新