2011-10-03 22 views
9

trato de aplicar un filtro a nivel de bits utilizando MYSQL (con UDF si es necesario)operaciones bit a bit MySQL y filtrar

El filtro es algo así como una Y, sino que quieren utilizar la máscara para construir una nueva cadena de bits ... Déjeme explicar con un ejemplo:

Supongamos que tengo una tabla con el almacenamiento de blob 8 flujos de bits:

  • datos1: 10110110
  • data2: 01100010
  • datos3: 00010011

entonces tengo una máscara a aplicar para obtener los bits de datos al valor de la máscara es 1

  • MÁSCARA: 00101011

Y así sale el siguiente esperada resultados:

  • datos1: 1010
  • dat A2: 1010
  • datos3: 0011

¿Hay una manera de optimizar el filtrado, sin lazo con cada bit de "máscara" para obtener el valor correspondiente en "datos" fila ...

CLARIFICACION

Acabo de tomar 8 bits para el puesto, pero es más como 256 bytes

para Joe: para aclarar el exemple, la máscara 00101011 se interpreta como: obtener la poco val ue desde el campo de datos en la posición 3,5,7,8, si lee la máscara de izquierda a derecha, enumerados del bit 1 al bit 8 ... Espero que esta aclaración sea "clara" ...

+0

No veo cómo se supone que esa máscara y esas filas deben devolver esos datos – Joe

+0

En mi opinión, es realmente difícil implementar esto sin un bucle. – Karolis

Respuesta

7

Puede utilizar operadores bit a bit en MySQL:

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

Ejemplo:

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

prueba rápida:

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

Esto se realiza en un bit AND con el patrón binario de la máscara que ha especificado.
Vea el enlace de arriba para más juguetes.

+1

No creo que esto sea lo que él quiere. – Karolis

7

La única forma que conozco de hacer lo que quieres es algo así como

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

Obviamente, usted tiene que construir la expresión en función de su máscara; que no es muy difícil de hacer, sólo un poco tedioso — que básicamente necesita para recorrer los bits en la máscara, algo como esto:

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);

El código de ejemplo anterior es en JavaScript, por lo se puede ejecutar como un fragmento aquí y obtener:

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

conectado a la consola, pero debe ser bastante fácil de portar a otros idiomas.

Cuestiones relacionadas