2012-04-19 5 views
0

pytables에서 값을 가져 오는 방법에 문제가 있습니다. 값은 비트 기반이지만 정수로 저장됩니다.비트 기반 값 쿼리

내 테이블의 열 중 하나가 Int32Column()이고 이름이 'Value'입니다. 이 칼럼에서는 모든 비트가 다른 의미를 갖는 정수 값을 저장합니다. 그래서 약간의 정보를 원한다면 나는 테이블로부터 가치를 취하고 약간의 비트 조작을 할 것입니다. 테이블에서 지정된 값을 가져 오는 쿼리를 만드는 방법을 모르겠습니다.

예를 들어 Value 열의 모든 값을 알고 싶습니다. 첫 번째 비트 == 1이고 세 번째 비트 == 1 인 모든 값을 알고 싶습니다.

어떻게 쿼리 하시겠습니까? 나는 예외를 받고 있어요,

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

을 :하지만 내가 마스크를 시도하고

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

처리 쿼리는 매우 빠른해야하기 때문에 미래의 행 많은 수의. 한 가지 제한 사항은 서버에서 int 형식으로 값을 가져 오기 때문에 값이 테이블의 int 값이어야한다는 것입니다. 누군가가 더 나은 해결책을 가지기를 바랍니다.

답변

1

나중에 참조하십시오.

나는 비슷한 문제가있어서 다음과 같이 해결했다. 일반적인 비트 연산자 (< <, >>)는 사용할 수 없으므로 &의 의미는 | 연산자는 논리적인데, 비트 단위가 아닌 즉흥적이어야합니다.

값 VAL에 n 번째 비트가 설정되어 있는지 확인하려면 재미있는 비트를 숫자 (2 ** 0)의 패리티를 나타내는 0 번째 위치로 옮길 수 있습니다. 패리티는 모듈러스 연산자를 사용하여 확인할 수 있습니다. 그래서, 예를 들어 비트 25가 설정되고 16이 설정되지 않았는지 확인하는 것과 같은 작업을 할 수 있습니다.

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

우아하지는 않지만 현재 사용 중입니다.