2011-10-03 14 views
9

मैं (यूडीएफ के साथ यदि आवश्यक) MYSQL का उपयोग कर एक बिटवाइज़ फिल्टर लागू करने के लिएMysql बिटवाइस संचालन और फ़िल्टर कर

फिल्टर एक और की तरह कुछ है, लेकिन मैं कोशिश मुखौटा का उपयोग करने के लिए एक नया बिट श्रृंखला का निर्माण करना चाहते ...

मान लीजिए मैं ब्लॉब 8 बिट धाराओं के भंडारण के साथ एक मेज है:

  • data1: 10110110
  • data2: 01100010
  • मुझे एक नमूने के साथ आप के बारे में बताएं 10
  • data3: पाने की उम्मीद निम्नलिखित 00101011

और इसलिए: 00010011

तब मैं जब मुखौटा मूल्य 1

  • मुखौटा है डेटा से बिट्स प्राप्त करने के लिए लागू करने के लिए एक मुखौटा है परिणाम:

    • data1: 1010
    • Dat a2: 1010
    • data3: 0011

    वहाँ "मुखौटा" के प्रत्येक बिट पर पाशन "डाटा" पंक्ति में संबंधित मान प्राप्त करने के लिए बिना, छानने का अनुकूलन करने के लिए एक रास्ता है ...

    स्पष्टीकरण

    मैं सिर्फ पद के लिए 8 बिट कर लिया है, लेकिन यह जो के लिए और अधिक 256 बाइट्स

    की तरह है: बिट वैल मिलती है: उदाहरण के लिए स्पष्ट करने के लिए, मुखौटा 00,101,011 के रूप में व्याख्या की है ue स्थिति 3,5,7,8 पर डेटा क्षेत्र से, अगर आप मुखौटा बाएं से दाएं, बिट 1 से बिट से 8 प्रगणित से पढ़ें ... उम्मीद है कि यह स्पष्टीकरण "स्पष्ट" है ...

+0

मुझे नहीं लगता कि यह मुखौटा और उन पंक्तियों को उस डेटा को वापस करने के लिए माना जाता है – Joe

+0

मेरी राय में यह एक लूप के बिना इसे लागू करना वास्तव में मुश्किल है। – Karolis

उत्तर

7

आप कर सकते हैं 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 
,210

यह मुखौटा आपके द्वारा निर्दिष्ट की बाइनरी पैटर्न के साथ एक बिटवाइज़ 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);

उदाहरण कोड ऊपर जावास्क्रिप्ट में है, इसलिए आप यहाँ एक टुकड़ा के रूप में चला सकते हैं और मिलती है:

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

कंसोल के लिए लॉग इन, लेकिन यह काफी अन्य भाषाओं के लिए बंदरगाह के लिए आसान होना चाहिए।

संबंधित मुद्दे