BVector 0.1
前回は、HTML の <head> タグの中で <script> タグを書いていましたが、今回は <body> タグの中で書いています。
実行結果
ソース
"expand source" を押すと展開されます。元に戻すには、このページを再ロードしてください。
bvector01.html
<h2>実行結果</h2>
<div class="text">
<script type="text/javascript" src="js/bvector01.js">BVector 0.1 は JavaScript を有効にする必要があります。</script>
</div>
bvector01.js
結果表示用の関数です。この関数の中身を WScript.Echo(str); に変更すると、Windows Script Host でも実行できるようになります。
/**
* BVector - 2進ベクトルオブジェクトの定義
* @version 0.1
* @author たかはしのんき
*
*/
/**
* 結果表示用の関数
* HTMLとして展開します。
* @since 0.1
*/
function writeln(str) {
document.writeln(str + "
");
}
2進ベクトルに値を設定するための関数です。BVector オブジェクトの中で使うために外側で定義しました。
/**
* (2進ベクトルの実体である)ビット配列の要素 i に 0 か 1 の値 value を設定します。
* @since 0.1
*/
function setValue(bits, i, value) {
var i0 = i - 1; // 0 originに変換
var i1 = i0 % 32; // 剰余
var i2 = Math.floor(i0 / 32);
if (value == 1)
bits[i2] |= mask[i1];
else if (value == 0)
bits[i2] &= ~mask[i1];
}
ビット操作のためのマスクです。
// ビット操作のためのマスクを定義します。
var mask = new Array (
0x80000000, 0x40000000, 0x20000000, 0x10000000,
0x08000000, 0x04000000, 0x02000000, 0x01000000,
0x00800000, 0x00400000, 0x00200000, 0x00100000,
0x00080000, 0x00040000, 0x00020000, 0x00010000,
0x00008000, 0x00004000, 0x00002000, 0x00001000,
0x00000800, 0x00000400, 0x00000200, 0x00000100,
0x00000080, 0x00000040, 0x00000020, 0x00000010,
0x00000008, 0x00000004, 0x00000002, 0x00000001
);
2進ベクトルオブジェクト BVector の定義です。
/**
* 2進ベクトルオブジェクト BVector を定義します。
* @since 0.1
*/
BVector = function() {
this.order = arguments.length;
if (arguments.length == 1)
this.order = arguments[0];
this.bits = new Array(Math.ceil(this.order / 32.0));
if (arguments.length == 1)
for (var i = 0; i < this.bits.length; i++)
this.bits[i] = 0;
else
for (var i = 1; i <= this.order; i++)
setValue(this.bits, i, arguments[i - 1]);
};
2進ベクトルオブジェクトの指定した要素に値を設定するメソッドです。
/**
* 2進ベクトルオブジェクト BVector の要素 i に 0 か 1 の value を設定するメソッド
* BVector.setValue(i, value) を定義します。
* @param i 要素番号
* @param value 設定する値
* @since 0.1
*/
BVector.prototype.setValue = function(i, value) {
setValue(this.bits, i, value);
};
2進ベクトルオブジェクトの指定した要素 の値を取り出すメソッドです。
/**
* 2進ベクトルオブジェクト BVector の要素 i の値を取り出すメソッド
* BVector.getValue(i) を定義します。
* @param i 要素番号
* @return 値
* @since 0.1
*/
BVector.prototype.getValue = function(i) {
var i0 = i - 1; // 0 originに変換
var i1 = i0 % 32; // 剰余
var i2 = Math.floor(i0 / 32);
return ((this.bits[i2] & mask[i1]) == 0) ? 0 : 1;
};
2進ベクトルオブジェクトをコピーするメソッドです。
/**
* 2進ベクトルオブジェクト BVector をコピーするメソッド
* BVector.clone() を定義します。
* @return 2進ベクトルのコピーを返します。
* @since 0.1
*/
BVector.prototype.clone = function() {
var bv = new BVector(this.order);
for (var i = 0; i < this.bits.length; i++)
bv.bits[i] = this.bits[i];
return bv;
};
2進ベクトルオブジェクト同士の論理和をとるメソッドです。c = a.or(b); とした場合、$\boldsymbol{c} = \boldsymbol{a} \vee \boldsymbol{b}$ が実行されます。
/**
* 2進ベクトルオブジェクト bv2 との論理和をとるメソッド
* BVector.or(bv2) を定義します。
* @param bv2 論理和の第2オペランドを指定します。
* @return bv2 との論理和を返します。
* @since 0.1
*/
BVector.prototype.or = function(bv2) {
if (this.order != bv2.order)
return null;
var bv = this.clone();
for (var i = 0; i < this.bits.length; i++)
bv.bits[i] |= bv2.bits[i];
return bv;
};
2進ベクトルオブジェクト同士の論理積をとるメソッドです。c = a.and(b); とした場合、$\boldsymbol{c} = \boldsymbol{a} \wedge \boldsymbol{b}$ が実行されます。
/**
* 2進ベクトルオブジェクト bv2 との論理積をとるメソッド
* BVector.and(bv2) を定義します。
* @param bv2 論理積の第2オペランドを指定します。
* @return bv2 との論理積を返します。
* @since 0.1
*/
BVector.prototype.and = function(bv2) {
if (this.order != bv2.order)
return null;
var bv = this.clone();
for (var i = 0; i < this.bits.length; i++)
bv.bits[i] &= bv2.bits[i];
return bv;
};
2進ベクトルオブジェクトを文字列に変換するメソッドです。
/**
* 2進ベクトルオブジェクト BVector を文字列に変換するメソッド
* BVector.toString() を定義します。
* @return 文字列を返します。
* @since 0.1
*/
BVector.prototype.toString = function() {
var str = "(";
for (var i = 0; i < this.order; i++) {
str = str + this.getValue(i + 1); // 1 origin に変換
if (i < this.order - 1)
str = str + ",";
}
str = str + ")";
return str;
};
2進ベクトルオブジェクトをダンプするメソッド(デバッグ用)です。eval()関数を使っています。
/**
* 2進ベクトルオブジェクト BVector をダンプするメソッド
* dumpBV(name) を定義します。(デバッグ用)
* @param name BVector オブジェクトを文字列で指定します。
* @since 0.1
*/
function dumpBV(name) {
writeln(name + ".order=" + eval(name).order);
writeln(name + ".bits.length=" + eval(name).bits.length);
writeln(name + ".bits[0]=" + eval(name).bits[0]);
writeln(name + ".toString()=" + eval(name).toString());
writeln("");
};
2進ベクトルオブジェクトをテストするメソッド(デバッグ用)です。eval()関数を使っています。
/**
* 2進ベクトルオブジェクト BVector をテストするメソッド
* test(exp) を定義します。(デバッグ用)
* @param exp テストする JavaScript の式を文字列で指定します。
* @since 0.1
*/
function test(exp) {
writeln(exp);
eval(exp);
dumpBV(exp.substr(0, 1));
}
このプログラムのメインです。2進ベクトルオブジェクトの簡単なテストを行っています。
// メイン
test("a = new BVector(1, 1, 0, 0);");
test("b = new BVector(1, 0, 1, 0);");
test("c = a.clone();");
test("c = a.or(b);");
test("c = a.and(b);");
// メインおわり
Powered by
SyntaxHighlighter
MathJax