2011-10-03 15 views
9

próbuję wprowadzić filtr bitowe MySQL (z UDF w razie potrzeby)Mysql bitowe operacje i filtrować

Filtr jest coś jak I, ale chcę użyć maski na budowę nowego bitowy ciąg ... Wytłumaczę ci z próbką:

Załóżmy, że mam tabelę z kropelka zapisania 8 strumienie bitów:

  • dane1: 10110110
  • dane2: 01100010
  • danych3: 00010011

to mam maskę, aby zastosować, aby uzyskać bity z danymi, gdy wartość maska ​​jest 1

  • MASK: 00101011

I tak pojawia się następujący oczekiwano wyniki:

  • dane1: 1010
  • DAT A2: 1010
  • danych3: 0011

Czy istnieje sposób, aby zoptymalizować filtrowanie, bez pętli na każdym kawałku „maska”, aby uzyskać odpowiednią wartość w „danych” wiersza ...

wYJAŚNIENIE

właśnie podjęte 8 bitów na stanowisko, ale to nic więcej jak 256 bajtów

dla Joe: Aby wyjaśnić exemple, maska ​​00101011 jest interpretowane jako: uzyskać bitowy val z pola danych na pozycji 3,5,7,8, jeśli czytasz maskę od lewej do prawej, wyliczoną z bitu 1 do bitu 8 ... Mam nadzieję, że to wyjaśnienie jest "jasne" ...

+0

Nie widzę, jak ta maska ​​i te wiersze mają zwrócić te dane. – Joe

+0

Moim zdaniem naprawdę trudno jest zaimplementować to bez pętli. – Karolis

Odpowiedz

7

Możesz używać operatorów bitowe w mysql

http://dev.mysql.com/doc/refman/5.0/en/bit-functions.html

przykład:

SELECT (data1 & b'00101011') as output1 FROM ...... 

Szybki test:

SELECT (b'10110110' & b'00101011') as output1 

Działa to bitowo AND z binarnym wzorcem określonej maski.
Zobacz powyższy link, aby uzyskać więcej zabawek.

+1

Nie sądzę, że to jest to, czego chce. – Karolis

7

Jedynym sposobem, wiem, co chcesz robić coś jak

SELECT ((data >> 2) & 8) | ((data >> 1) & 4) | (data & 3) FROM ... 

Oczywiście, trzeba będzie zbudować w oparciu o wyrażenie swojej maski; nie jest to bardzo trudne do zrobienia, tylko nieco nużące — w zasadzie trzeba pętli ciągu bitów w masce, coś takiego:

var mask = 0b00101011; 
 
var parts = new Array(); 
 
var shift = 0; 
 
var unshift = 0; 
 
while (mask > 0) { 
 
    while ((mask & 1) == 0) { 
 
     shift = shift + 1; 
 
     mask = mask >> 1; 
 
    } 
 
    submask = 0; 
 
    while ((mask & 1) == 1) { 
 
     submask = submask + (1 << unshift); 
 
     unshift = unshift + 1; 
 
     mask = mask >> 1; 
 
    } 
 
    parts.push("((data >> " + shift + ") & " + submask + ")"); 
 
} 
 
var expr = parts.join(" | "); 
 
console.log(expr);

Powyższy przykład kodu w JavaScripcie, więc można uruchomić go jako urywek tutaj, a otrzymasz:

((data >> 0) & 3) | ((data >> 1) & 4) | ((data >> 2) & 8) 

zalogowany do konsoli, ale powinno być dość łatwe do portu na inne języki.

Powiązane problemy