2011-10-03 74 views
9

我嘗試(如果需要使用UDF)實現使用MYSQL按位濾波器Mysql的位運算和濾波

過濾器是一樣的東西和,但我想用面膜來建立一個新的比特串... 讓我用一個樣本說明你:

假設我有一個表BLOB存儲8個比特流:

  • 數據1:10110110
  • 數據2:01100010
  • 數據3:00010011

然後我就口罩適用於得到的數據位時,掩碼值爲1

  • MASK:00101011

因此得到以下預期結果:

  • 數據1:1010
  • DAT A2:1010
  • 數據3:0011

有沒有辦法來優化過濾,沒有循環的「面具」的每一點,以獲得在「數據」行的相應值...

澄清

我剛8位的職位,但它更像是256個字節

喬:爲了澄清爲例,面具00101011被解釋爲:得到位VAL如果你從左至右讀取掩碼,從第1位到第8位列舉...希望這個解釋是「清除」...

+0

我沒有看到這面具和這些行應該如何返回數據 – Joe

+0

在我看來,這真的很難實現這一點沒有一個循環。 – Karolis

回答

7

你可以從數據字段在位置3,5,7,8,使用按位運算符在MySQL:

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

實施例:

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

快速試驗:

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

這會按您指定的掩碼的二進制模式執行按位AND
查看上面的鏈接瞭解更多玩具。

+1

我不認爲這是他想要的。 – Karolis

7

我知道這樣做的唯一方式,你想要的東西是一樣的東西

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

很明顯,你必須構建基於你的面具的表達;這不是很困難的事,只是有點乏味—你基本上需要循環位的面具,像這樣:

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

上面的示例代碼在JavaScript,因此你可以作爲一個片斷跑這裏來了,並得到:

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

登錄到控制檯,但它應該是很容易移植到其他語言。