Javascript 是否存在[].pop()的按位等效项?

Javascript 是否存在[].pop()的按位等效项?,javascript,bit-manipulation,Javascript,Bit Manipulation,我需要遍历位图,从最小的位开始 在第一个循环中,我需要检查最小的位,然后是第二个最小的位。因此,如果我的值是6,我会得到false、true、true 我想编写如下代码: if (bitmap.pop()){ 但这不是一个选择。什么是优雅的选择?高效:使用 效率较低:将数字二进制表示形式的0和1放入一个数组,并使用array.pop() 对于按位运算符,这应该可以: var a = 6; do { if (a & 1) { // true } else

我需要遍历位图,从最小的位开始

在第一个循环中,我需要检查最小的位,然后是第二个最小的位。因此,如果我的值是
6
,我会得到
false、true、true

我想编写如下代码:

if (bitmap.pop()){
但这不是一个选择。什么是优雅的选择?

高效:使用


效率较低:将数字二进制表示形式的0和1放入一个数组,并使用
array.pop()

对于按位运算符,这应该可以:

var a = 6;

do {
    if (a & 1) {
        // true
    } else {
        // false
    }
} while (a = a >> 1);
如果您不想使用经典方法,并且需要类似于pop()的函数,您可以使用一个定义pop()函数的原型对象,如下所示:

function PopNumbers (startNumber) {
    this.startNumber = startNumber;
}

PopNumbers.prototype.hasNext = function () {
    return (this.nextNumber === undefined || this.nextNumber !== 0);
};

PopNumbers.prototype.pop = function () {
    if (this.hasNext()) {
            var currentNumber = this.nextNumber || this.startNumber;
            this.nextNumber = currentNumber >> 1;
            return !!(currentNumber & 1);
    }
};

小提琴:“优雅”的标准是什么?也许:


您可以使用一个简单的
&1
操作来提取最后一位。现在,要移位位,只需在最后一项上使用
>
运算符即可。为了避免在所有条目中移动值,我们可以简单地跟踪最后一个整数中剩余的位数

下面是一个示例,假设位数组的最后一个整数中有最低有效位,并且每个条目使用32位

var values = [0xffffffff, 0xffffffff, 0xffffff01];

var lsbSize = 32;

function pop() {
    var value = values[values.length-1] & 1; // extract last bit
    value = value?true:false;
    values[values.length-1] = values[values.length-1] >> 1; // shift out the last bit in the last entry
    lsbSize--;
    if(lsbSize == 0) { // if there are no more bits left in the last entry. simply pop it out and reset the size
        values.pop();
        lsbSize = 32;
    }
    return value;
}

下面是一个

(6).toString(2).split(“”).reverse().map(函数(i){returni==='1';})
?@zerkms很棒,不过您可能想改用
='1'
,这样您就不会误以为您正在以字符串的形式对数字进行迭代
:P
位数组数据结构是如何组织的?您应该能够使用简单的位屏蔽,即
v&1
操作来提取最后一位。如果只有一个整数,则只需
>
值即可弹出第一位。如果您有任意长度的位数组,那么您必须跟踪最后一项中剩余的位数。@zero这正是我所想的<代码>字符串(2)。拆分(“”)然后弹出。这是经典的方式。但似乎我会坚持这一点。我添加了一种非经典的方式;)它使用了一个额外的原型对象,应该与您的需求相匹配
var values = [0xffffffff, 0xffffffff, 0xffffff01];

var lsbSize = 32;

function pop() {
    var value = values[values.length-1] & 1; // extract last bit
    value = value?true:false;
    values[values.length-1] = values[values.length-1] >> 1; // shift out the last bit in the last entry
    lsbSize--;
    if(lsbSize == 0) { // if there are no more bits left in the last entry. simply pop it out and reset the size
        values.pop();
        lsbSize = 32;
    }
    return value;
}