簡體   English   中英

Mysql Bitwise操作和過濾

[英]Mysql Bitwise operations and filter

我嘗試使用MYSQL實現按位過濾器(如果需要,使用udf)

過濾器類似於AND,但我想使用掩碼來構建一個新的位串...讓我用一個示例解釋你:

假設我有一個存儲8位流的blob表:

  • data1:10110110
  • data2:01100010
  • data3:00010011

然后我有一個掩碼應用於掩碼值為1時從數據中獲取位

  • 面具:00101011

因此得到以下預期結果:

  • data1:1010
  • data2:1010
  • data3:0011

有沒有辦法優化過濾,沒有循環“掩碼”的每一位,以獲得“數據”行中的相應值...

澄清

我剛剛為帖子取了8位,但它更像是256字節

對於Joe:為了澄清這個例子,掩碼00101011被解釋為:從位置3,5,7,8的數據字段獲取位值,如果從左到右讀取掩碼,從第1位枚舉到第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
有關更多玩具,請參閱以上鏈接。

我知道做你想做的事的唯一方法是

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)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM