0

pytables から値を取得する方法に問題があります。値はビット ベースですが、整数として格納されます。

私のテーブルの1つの列はInt32Column()name'Value'です。この列には、すべてのビットが異なる意味を持つ整数値を格納します。したがって、あるビットの情報が必要な場合は、テーブルから値を取得し、ビット操作アクションを実行します。テーブルから指定された値を取得するためのクエリを作成する方法がわかりません。

たとえば、Value最初のビット == 1 と 3 番目のビット ==1 である列のすべての値を知りたいとします。

そのクエリを作成する方法は?私はマスクを試しています:

[ x['Value'] for x in table.where('((Value & mask) == mask)')]

しかし、私は例外を取得しています:

NotImplementedError: unsupported operand types for \*and\*: int, int

今後大量の行が発生するため、クエリの処理は非常に高速である必要があります。制限の 1 つは、サーバーから int 形式で値を取得しているため、値はテーブル内の int 値でなければならないということです。誰かがより良い解決策を持っていることを願っています。

4

1 に答える 1

1

今後の参考のために。

同様の問題があり、次の方法で解決しました。通常のビット単位の演算子 (<<、>>) は使用できず、& の意味は | です。演算子は論理的であり、ビットごとではなく、即興で作成する必要があります。

値 VAL に n 番目のビットが設定されているかどうかを確認するには、対象のビットを 0 番目の位置にシフトします。これは、数値のパリティ (2**0) を示します。パリティは、剰余演算子を使用してチェックできます。したがって、たとえば、ビット 25 が設定されていて 16 が設定されていないかどうかを確認するようなことができます。

table.where("((VAL/(2**25))%2==1) & ((VAL/(2**16))%2==0)")

エレガントではありませんが、今のところ機能しています。

于 2012-08-20T13:00:39.903 に答える