[英]Mysql Bitwise operations and filter
我嘗試使用MYSQL實現按位過濾器(如果需要,使用udf)
過濾器類似於AND,但我想使用掩碼來構建一個新的位串...讓我用一個示例解釋你:
假設我有一個存儲8位流的blob表:
然后我有一個掩碼應用於掩碼值為1時從數據中獲取位
因此得到以下預期結果:
有沒有辦法優化過濾,沒有循環“掩碼”的每一位,以獲得“數據”行中的相應值...
澄清
我剛剛為帖子取了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.