2012-03-12 6 views
0

私は呼び出し管理のための質問があります。決定を通じて特定のメソッドを呼び出す最速の方法

byte[]に3バイトのペイロードを持つメッセージが表示されます。そこのビットが異なると、別のメソッドを呼び出すことになります。私はバイトとシフトセット1の間の論理積でビットの値を取得しました。特定のメソッドを呼び出すためにelseifなどを使用しました。それを実現する別の可能性がありますか、おそらくハッシュマップなのでしょうか?

少なくとも、maxを使用する必要があります。 Javaの1.4

挨拶、 fnobbi

答えて

0

どのように多くの異なるメソッドを呼び出すかによって異なります。それが(ここでは推測している)20未満であれば、int(4バイト - 下位3を使用)で単純なビットマスクテストをif()と使用します。例えば

:あなたが唯一の停止、その後1つのメソッドを呼び出している場合

public static void callMethod(byte[] bytes) { 
    int bits = (bytes[2] & 0xFF) << 16 + 
       (bytes[1] & 0xFF) << 8 + 
       (bytes[0] & 0xFF); 
    if ((bits & 1) > 0) { 
     methodForBit0Set(bytes); 
    } 
    if ((bits & 2) > 0) { 
     methodForBit1Set(bytes); 
    } 
    if ((bits & 4) > 0) { 
     methodForBit3Set(bytes); 
    } 
    // etc 
} 

、あなたがifselsesを使用したいと思う、とも最も頻繁にのためにテストを注文することもできます最初に期待される。

ハッシュマップを使用すると、でなくても、これらの非常に高速な操作よりもはるかに高速です。多くのテストを行っても、この読み込み、デバッグ、および保守がより簡単です。

+0

ありがとうございます。機能表はありませんか? – fnobbi

+0

バイトをマスクして、符号なしとして処理する必要があります。 'bits'はその唯一の24ビットとして' int'になります。これが検索するパターンであれば、私は最も低いビットセットを検索し、その値をオンにします。 –

+0

なぜあなたは長く使っていますか?おそらくintを使用することを意図していました。なぜなら、それはテキストで言及したように4バイト幅であるからです。 longは8バイトで、3バイトのメッセージの場合は残念です。 – Durandal

0

あなたもJavaの1.4で、スイッチを使用することができます。スイッチは、異なるバイトが相互作用する場所でネストすることができます。あなたは1600万の可能な方法で呼び出すことはできないと思います。 (256^3)

+0

あなたは冗談ですか?私はビットマスクを仮定しています...あなたはすべてのコンボを提供する必要があるテーブルのサイズを想像できますか? – Bohemian

+0

私が言ったように、あなたは1600万の異なる方法で呼び出すことはできないと仮定します。その場合、起こり得る単純化が必要です。メソッドごとに複数のケースグループを持つべきではありません。 –

関連する問題