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;
}