淺談按位存儲

畢業季,浪了很久。。。過了這個六月,就正式踏入社會啦。。。總感受還沒準備好。。。。。。。。。。 特大轉折。。。記錄一下最近的一些知識。。。javascript

按位存儲的概念css

       在數據庫存儲中,可使用一種類二進制字符串來保存多個值,當這個二進制值是由0和1組成的時候,就能夠按照從右到左,每一個位按照2^n計算值相加進而換算成爲一個十進制數,從而實現一個十進制值保存多種狀況的目的。java

舉個栗子數據庫

如今3種不一樣的css樣式,能夠應用於不一樣的一些地方,如app、pc、小程序等。小程序

按值存儲的話,分別用1-3表明3種樣式(styleType),分別用1-3表明支持類型app、pc、小程序(supportType),而後存儲的時候應該是按這種方式:segmentfault

 

styleType supportType
1 1,3
2 1,2,3
3 1
... ...

 

 

 

 

 

顯然,這樣的話,supportType這個字段就要存儲多個styleType表明值。數組

那麼,按位存儲是怎樣的呢。用3位的類二進制字符串來表示,從左到右每一位分別對應樣式1-3,1表明支持該樣式,0表明不支持該樣式。如要表明支持樣式1,3的話,就用101來表示,第1、三位爲1,其餘位置0.那咱們存儲的時候,是否是就存儲這麼一個3位的字符串呢。並非,要存儲的是轉換後的一個十進制的數值。由於每個位按照2^n轉換以後相加獲得的十進制必然能夠反解,這樣就能夠知道這個值表明的是哪些樣式了。app

按位存儲的話,應該是這樣存的:編碼

 

styleType supportType
1 5
2 7
3 1
... ...

 

 

 

 

 

 

實際應用spa

①場景一,在app環境中,過濾樣式,即只把支持app的樣式過濾出來顯示。

應用原理:數值相與,只有1與1結果爲1。

也就是說,咱們若是要過濾出支持app的樣式,也就是過濾styleType中第一位爲1時對應的樣式,即1**,也就是十進制數值中包含4這個數的。

js中,十進制數能夠直接相與,因此遍歷過濾時代碼能夠直接這樣判斷:

 

(item.supportType & 4 == 4)?'對應的styleType支持':'對應的styleType不支持'    //注意,==優先級比&大,因此要加括號

 

②場景二,修改supportType

由於保存到數據庫中的是一個十進制的數組,因此才修改對應關係的時候,必須知道改的是哪一個位置,並改變相應位置上的值,類二進制表示就是0變爲1或1變爲0的過程,可是改變十進制的數組則是改變對應的位的2^n的增長減小過程。

如:

 

    var supportType = { //按位編碼,預留3位
        'app':4,
        'pc':2,
        'mini':1
    }
  var supportVal = 0;
  i f(obj.supportmini == 1){ //支持小程序
     supportVal= supportVal+supportType .mini;
   } 
  if(obj.supportPc == 1){ //支持pc
     supportVal= supportVal+ supportType .pc;
  } 
  obj.supportVal= supportVal;

 

最後,把對應的十進制存到數據庫中便可。

更多場景參考這裏。  

相關文章
相關標籤/搜索