スイッチング状態情報の保存


システムには多くのステータス情報が存在します.特に0-1値情報は、ある条件が達成されたかどうか、ある機能が存在するかどうか、ある操作が成功したかどうかなど、様々な状態条件番号をbollan配列で表します.
 
//0  a  ,1  b  
//a    
status[0]=true;
//b    
status[1]=false;
 
ほとんどの言語は実際にはbootleanタイプを整数タイプに等しくするため、javascriptも例外ではなく、他の言語とjavascriptは違っています.javascriptはブラウザで実行しなければなりません.特定の条件の下で、格納要求がより厳しくなります.
スイッチの状態を0-1のバイナリビットで表しています.複数の状態を一つの整数に圧縮して保存します.普通の整数は32ビットです.(javascriptは違いがあります.まだ確定していません.).すると、理論的に8倍の空間が節約されます.価格はアクセスの演算を増加させます.
 
1.記憶配列
整数配列を使ってビットセットを作成します.
 
var store = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
 
2.設定状態
スイッチの状態番号によって、整数配列のある整数に位置し、特定のビットを1として設定します.
 
var index = Math.floor(num / 32),
                index2 = num % 32,
                mask = Math.pow(2, index2);
        store[index] |= mask;
 
3.クリア状態
スイッチの状態番号によって、整数配列のある整数に位置し、特定のビットを0に設定します.
 
var index = Math.floor(num / 32),
all_one = (Math.pow(2, 32) - 1),
                index2 = num % 32,
                mask = all_one ^ Math.pow(2, index2);
        store[index] &= mask;
 
4.保存
 
最後にクッキーに格納するときは文字列の書式に変換します.ここには三つのオプションがあります.
1.storeの各intを直接toString()に10進文字列に変換する
2.storeの各int、toString(16)を16進文字列に変換する
しかし、この2つは、1文字バイトの完全記憶空間を十分に利用していません.16進数でも4ビットは1文字バイトの空間を占有しています.
3.より優れた解は、8ビットごとに、String.from CharCodeを介してバイトに変換し、最終的にクッキーに格納することである.
 
5.デコード
 
cookieのバイトによって、string.charCodeAtによってこのバイト代表の数字が得られ、さらにビット演算によって各スイッチ状態が得られます.
 
var v = S.Cookie.get("test");
for (var i = 0; i < v.length; i++) {
  //  
  var n = v[i].charCodeAt(0);
}
 
簡単に、状態グループの数字の各ビットを0,1かどうかを検出することにより、状態設定がオンになっている番号を知ることができます.複雑度はO(n)、一般n=32です.
 
//slower    
    function getOnesSlow(n,base,re) {    	
    	base=base||0;
    	var mask=1;
    	for(var i=0;i<32;i++){
    		if(n&mask) re.push(i);
    		mask=mask<<1;	
    	}
    }
 
実はもっと精巧なアルゴリズムがあります.主に負の数を利用した二進法は絶対値の二進法によって逆を取った後にプラスして形成されています.一つの数字とその負の数がビットを押す時、戻りの結果は元の数の最低位1を除いて保留されます.他は全部0です.例えば、0です.
 
1010の負の対応数は111…0101、プラス1は1111…0110です.
 
1111…0110&1010=10
 
結果1のビット順の順序数は、元の数字1010の最下位1のビット順の数である.
 
10..0によって、1の位置のビット順の数を迅速に知るために、サイクル数ではなくインデックスを事前に作成することができます.
 
    var bton={};
    var base=1;
    for(var i=0;i<32;i++){
    	bton[base]=i;
    	base=base<<1;
    }
 
数字に含まれている1桁の数の配列をすぐに取得できます.
 
//fastest one :
    function getOnes(n,base,re){
    	base=base||0;
    	while(n){
    		var mask=n&-n;
    		re.push(bton[mask]+base);
    		n &= ~mask;
    	}
    }
 
最も速い0回の循環、すなわちn=0、最も遅い32回の循環、すなわちn=1111…1(javascriptビットの操作対象は32ビットの整数)は、平均16回の循環であり、速度は簡単なビット毎の検出アルゴリズムに比べて倍増している.
 
6.問題
cookieでは、各バイトは8 bitの情報量を完全に表していません.ASCIIにはいくつかの区間が特殊な役割をする文字(例えば、頭32個)があるからです.HTTPヘッダの一部としては、理論的にはこれらの文字は使用できません.Uuencodeアルゴリズム(http://en.wikipedia.org/wiki/Uuencoding)を参照すると、一般的にはANSI文字毎に6 bitの情報量を符号化することができる.(注意してくれてありがとうございます)
 
デモ
 
 
拡張読み
 
 
javascriptはビット操作の分野でも頭角を現し始めました.海外ではjavaフローを参照して設計を読み取るbase 64デコーダ、さらにはdeflateデコーダがあります.これによってdiv構築pngピクチャを直接使うデモが生まれました.とてもいいです.
 
  Embodding Base 64 Image Data into a Webpage
  Use Javascript to Take a Sreenshot of a Flash Movie
 Base 64 Enccoded Images for Internet Explorer
  Parsing Base 64 Enccoded Binary PNG Images in JavaScript