创建一个大位字段?

Joh*_*n K 8 javascript

我想在JavaScript中创建一个大位字段,它将有效地表示多维标记数组(使用索引来跳转到物理"1D"结构中的各个维度).

我正在考虑如何使用字符串作为位,而不是一堆数字,所以我可以先分配一个适当长度的字符串.数据类型,Unicode和转换等注意事项发挥作用(在JavaScript 1.3之前也没有Unicode支持).

但是,我对其他如何使用JavaScript来实现大位字段的建议持开放态度.

更新:
仅供参考:平均而言,我可能正在使用~2187位/标记(274字节),但想要一个通用答案,而不是可以容纳更多位.

Mat*_*ley 12

字符串的一个问题是它们是不可变的,所以如果你想改变任何东西,你需要重建字符串.

我会坚持使用数字.使用按位运算符,每个数字可以匹配32位.

由于JavaScript数字是双精度浮点数,因此最多可以容纳53位,但是按位运算符将其操作数转换为32位整数,因此您将无法使用它们来获取单个位(如果您想要,你可以通过除法Math.pow等的组合来完成同样的事情,但它会更复杂).

这是一个基本实现,可以让您获取,设置和取消设置各个位:

function BitField() {
    this.values = []; // You could set the length here, but it's not necessary
}

BitField.prototype.get = function(i) {
    var index = (i / 32) | 0; // | 0 converts to an int. Math.floor works too.
    var bit = i % 32;
    return (this.values[index] & (1 << bit)) !== 0;
};

BitField.prototype.set = function(i) {
    var index = (i / 32) | 0;
    var bit = i % 32;
    this.values[index] |= 1 << bit;
};

BitField.prototype.unset = function(i) {
    var index = (i / 32) | 0;
    var bit = i % 32;
    this.values[index] &= ~(1 << bit);
};
Run Code Online (Sandbox Code Playgroud)