位運算解決多標籤問題【原創】

一半水一半冰發表於2019-05-19

日常開發中經常用到一個酒店下有多個標籤比如酒店的風格特點有:無柱 場地方正 豪華 美食 自然採光 園林草坪 溫泉 景區周邊 水景 泳池 中式院落 西式裝修 少數民族 會場進車 高爾夫

我們一般都會對其進行編號:

{
    '1':  無柱,
    '2':  場地方正,
    '3':  豪華,
    '4':  美食,
    '5':  自然採光,
    '6':  園林草坪,
    '7':  溫泉,
    '8':  景區周邊,
    '9':  水景,
    '10': 泳池,
     '11': 中式院落,
    '12': 西式裝修,
    '13': 少數民族,
    '14': 會場進車,
    '15': 高爾夫
}

存放在資料庫時主要是存放該值的key值,如果一個酒店只有一個標籤是沒什麼問題的,但是如果一個酒店有多個標籤,並且又需要支援單個標籤也可以篩選出該酒店就需要用到位運算,那具體這個位運算怎麼設計呢?需要我們一起看看。

我們假設某個酒店存在 無柱 美食 泳池 三個標籤
這樣我們可以設計一個長度為15的二進位制數,滿足條件的位為1,不滿足的為0,那該酒店的二進位制數為 000001000001001
轉換為十進位制為 521
這樣我們存放到資料庫裡面的數值為 521

那這樣怎麼獲取該酒店是否有該標籤呢?

我們可以採用位運算的與(&)運算:兩個位都為1時,結果才為1

那如果我們要判斷無柱這個標籤是否存在該酒店
首先獲取代表無柱的二進位制數000000000000001
然後轉換成10進製為1,
最後我們可以通過 tags & 1 來判斷該酒店是否有無柱這個標籤。

資料庫查詢語句為:

SELECT * from hotel_info WHERE (tags & 1);
SELECT * from hotel_info WHERE (tags & 4);
SELECT * from hotel_info WHERE (tags & 10);

好了,今天的分享就到這裡,明天見

相關文章