/ Published in: JavaScript
Shows how to implement a primitive bit vector in js
Expand |
Embed | Plain Text
Copy this code and paste it in your HTML
function BitVector(data) { this.data = data == null ? [0] : data; } BitVector.prototype.and = function (other) { var data = new Array(); var newLen = Math.max(other.data.length, this.data.length); for (var i = 0; i < newLen; i++) { data[i] = this.data[i] & other.data[i]; } return new BitVector(data); } BitVector.prototype.or = function (other) { var data = new Array(); var newLen = Math.max(other.data.length, this.data.length); for (var i = 0; i < newLen; i++) { data[i] = this.data[i] | other.data[i]; } return new BitVector(data); } BitVector.prototype.xor = function (other) { var data = new Array(); var newLen = Math.max(other.data.length, this.data.length); for (var i = 0; i < newLen; i++) { data[i] = this.data[i] ^ other.data[i]; } return new BitVector(data); } BitVector.prototype.not = function () { var data = new Array(); for (var i = 0; i < this.data.length; i++) { data[i] = ~this.data[i] } return new BitVector(data); } BitVector.prototype.empty = function () { for (var i = 0; i < this.data.length; i++) { if (this.data[i] != 0) return false; } return true; } BitVector.prototype.count = function () { var c = 0; for (var i = 0; i < this.data.length; i++) { var v = this.data[i]; if (v > 0) { for (b = 0; b < 32; b++) { var bitMask = Math.pow(2, b); c += (bitMask & v) != 0; } } } return c; } BitVector.prototype.clone = function () { var data = new Array(); for (var i = 0; i < this.data.length; i++) { data[i] = this.data[i]; } return new BitVector(data); } BitVector.prototype.testBit = function (index) { var bitPos = index % 32; var val = this.data[(index - bitPos) / 32]; var bitMask = Math.pow(2, bitPos); return (bitMask & val) != 0; } BitVector.prototype.setBit = function (index, value) { var bitPos = index % 32; var bitMask = Math.pow(2, bitPos); var arrPos = (index - bitPos) / 32; if (arrPos >= this.data.length) { for (var i = this.data.length; i < arrPos + 1; i++) this.data[i] = 0; } if (value) { // Oder-Verknüpfung der Bitmask this.data[arrPos] |= bitMask; } else { // Und-Verknüpfung des Komplements der Bitmask this.data[arrPos] &= ~bitMask; } } BitVector.prototype.toString = function () { var s = ""; for (var i = 0; i < this.data.length * 32; i++) { s += this.testBit(i) ? '1' : '0'; } return s; }