【问题标题】:rotation code optimization (Java)旋转代码优化 (Java)
【发布时间】:2015-11-22 00:22:50
【问题描述】:

所以我有一些经常运行的代码来评估旋转状态。它有两个字节,每个字节的范围是 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)

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

【问题讨论】:

    标签: java rotation bit-manipulation bitwise-operators cycle


    【解决方案1】:

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

    我认为您的表格显示了所有有效的可能性,您将使用带有 0

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

        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”和“

    【讨论】:

      【解决方案2】:

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

      其次,你说你试图避免分支,但你还是在其中放置了三个分支(两个 if 语句和一个条件运算符......)。

      第三,根本不清楚你要做什么(例如,直观上左+右和上+下都会导致“不做任何事情”,但你给了他们不同的结果),如果正确的做法可能是重新考虑比您的狭隘问题更广泛的问题。

      第四,当您处理位操作时,“它不应该发生,但如果发生,则分配这个值”会适得其反。如果你想要最大速度,你应该说“它不应该发生,所以如果它发生了,那么任何值都是可以接受的”。

      讲得够多了,如果您在第四点中接受我的建议,那么以下内容就可以解决问题:

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

      【讨论】:

        猜你喜欢
        • 2010-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多