0

私は(python 3.3で)作成しているプロジェクトを持っており、次のことを行うための効率的な(またはよりきれいな方法)があるかどうかを調べようとしています。

次のようなバイナリ/16 進文字列を抽出する関数があります (ビットのグループは、例としてのみ分割されています)

  • 0000 1111 0002 0001
  • 0000 1111 0003 0001
  • 0000 1111 0002 0002
  • 0000 1110 0002 0001

ここで、私がやりたいことは、これらを関数に渡し、2 番目のビット グループと 4 番目のビット グループ (オペコード) の値に応じてメソッドを起動できるようにすることです。(* 1111 * 0001) が一致するかどうかを確認し、これらのビットに関連する関数を返すハッシュ関数。

ハッシュ テーブルの辞書を使用するというアイデアはありましたが、キーをマスクにする方法がよくわかりません。

キー 11110001 と戻りたい関数の値で辞書を作成し、[4:8][12:16] を連結して渡すだけで機能するのですが、作成する方法があるかどうか疑問に思っていましたキーのハッシュ関数。(それが理にかなっている場合)クラスに入らず、ハッシュ関数をオーバーライドしてからそれを渡します。

おそらく、正規表現キーを格納し、有効な入力に対してそれを実行する何らかの形式のデータ構造でしょうか? - 作成することはできますが、何らかの組み込み関数が欠けているのではないかと考えています (車輪を再発明しないようにするためです)。

うまくいけば、これは理にかなっています!助けてくれてありがとう!

4

2 に答える 2

0

と を使用して小さなクラスを実装することを避ける理由はまったくありませ__hash____eq__。辞書はカスタム ハッシュ関数をサポートしており、それがその方法です。

KEY_MASK = 0xf0f0  # or whichever mask you need

class Key(object):
    __slots__ = 'num',
    def __init__(self, num):
        self.num = num
    def __hash__(self):
        return hash(self.num & KEY_MASK)
    def __eq__(self, other):
        return self.num & KEY_MASK == other.num & KEY_MASK
    def __ne__(self, other):
        return not self == other
于 2013-07-14T08:06:00.440 に答える
0

おそらく、例のビット値を実際に使用しているので、検索する前に値をマスクする新しいメソッド getmasked を持つディクショナリからディクショナリを派生させてみませんか...

于 2013-07-14T07:05:48.470 に答える