如何在javascript中生成每个X长度的位掩码

如何在javascript中生成每个X长度的位掩码,javascript,bit-manipulation,bitmask,Javascript,Bit Manipulation,Bitmask,我想创建一个X长度的位掩码数组,并寻找一个有效的函数 对于长度3,我希望它生成: 000, 001, 010, 011, 100, 101, 110, 111 我正在寻找一个解决方案,使用位数学来做到这一点-现在我只是使用常规for循环,因为我的位操作是基本的 就是这样: var length = 3, limit = 1 << length; //Shift length bytes to the left for(mask=0; mask < limit; m

我想创建一个X长度的位掩码数组,并寻找一个有效的函数

对于长度3,我希望它生成:

000, 001, 010, 011, 100, 101, 110, 111
我正在寻找一个解决方案,使用位数学来做到这一点-现在我只是使用常规for循环,因为我的位操作是基本的

就是这样:

var length = 3, 
    limit = 1 << length;  //Shift length bytes to the left
for(mask=0; mask < limit; mask++){
   console.log(mask);  //This will log in decimal, but the bin value is correct
}
var长度=3,

limit=1您是否尝试了以下方法:

function range(til) {
    var x = 0, xs = [];
    while (x < til) xs.push(x++);
    return xs;
}

function generate(n) {
    return range(Math.pow(2, n));
}
如果需要字符串格式,请使用以下函数:

function replicate(n, x) {
    var i = 0, xs = [];
    while(i++ < n) xs.push(x);
    return xs;
}

function generateBitmasks(n) {
    var padding = replicate(n, '0').join('');

    return range(Math.pow(2, n)).map(function (x) {
        return (padding + x.toString(2)).slice(-n);
    });
}

我希望这会有所帮助。

这是来自沙阿的相同想法,与埃德加·维莱加斯·阿尔瓦多的合并

// Pad with left 0's
function pad(val, width) {
  val = val + '';
  return val.length >= width ? val : new Array(width - n.length + 1).join('0') + val;
}

// Get a list of decimal numbers representing all the bitmasks up to the given length
function getBitmapDecimalList(length) {
    var bitmaskMax  = 1 << length;
    var bitmaskList = [];
    for (var i = 0; i < bitmaskMax; i++) {
        bitmaskList.push(i);
    }
    return bitmaskList;
}

// Get a list of strings representing all the bitmasks up to the given length
function getBitmapBinaryList(length) {
    var bitmaskMax  = 1 << length; // Shift operator, equivalent to Math.pow(2,length)
    var bitmaskList = [];
    for (var i = 0; i < bitmaskMax; i++) {
        // the `.toString(2)` is what transforms the number into a binary string
        var bitmaskBinary = Number(i).toString(2);
        var paddedBitmask = pad(bitmaskBinary, length);
        bitmaskList.push(paddedBitmask);
    }
    return bitmaskList;
}
//用左0填充
功能板(val,宽度){
val=val+'';
return val.length>=width?val:新数组(width-n.length+1)。join('0')+val;
}
//获取表示给定长度内所有位掩码的十进制数列表
函数getBitmapDecimalList(长度){

var bitmaskMax=1这只是0到2^n之间的数字-1@Barmar是的,我显然想得太多了:)
var bitmasks = generateBitmasks(3);
// Pad with left 0's
function pad(val, width) {
  val = val + '';
  return val.length >= width ? val : new Array(width - n.length + 1).join('0') + val;
}

// Get a list of decimal numbers representing all the bitmasks up to the given length
function getBitmapDecimalList(length) {
    var bitmaskMax  = 1 << length;
    var bitmaskList = [];
    for (var i = 0; i < bitmaskMax; i++) {
        bitmaskList.push(i);
    }
    return bitmaskList;
}

// Get a list of strings representing all the bitmasks up to the given length
function getBitmapBinaryList(length) {
    var bitmaskMax  = 1 << length; // Shift operator, equivalent to Math.pow(2,length)
    var bitmaskList = [];
    for (var i = 0; i < bitmaskMax; i++) {
        // the `.toString(2)` is what transforms the number into a binary string
        var bitmaskBinary = Number(i).toString(2);
        var paddedBitmask = pad(bitmaskBinary, length);
        bitmaskList.push(paddedBitmask);
    }
    return bitmaskList;
}