2014-01-12 46 views
0

我想創建一個X長度的位掩碼數組,並且正在尋找一個有效的函數。如何在javascript中生成X長度的每個位掩碼

對於長度3我想它產生:

000, 001, 010, 011, 100, 101, 110, 111 

我要尋找一個使用位數學這樣做的解決方案 - 現在我只是使用普通的for循環爲我的位運算是簡陋。

+4

這只是從0到2的數字^ n-1個 – Barmar

+0

@Barmar是的,我顯然這得太多:) – cyberwombat

回答

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

現在,您可以生成所有從0號到7如下:

var xs = generate(3); 

如果你想在字符串格式然後使用以下功能改爲:

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

現在您可以獲得0到7的位掩碼列表,如下所示:

var bitmasks = generateBitmasks(3); 

我希望有所幫助。

0

這只是這樣的:

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 
} 

,他們基本上所有數字的二進制表示從0到2^n-1個

希望這有助於。乾杯

0

這是Aadit M Shah的相同想法,與Edgar Villegas Alvardo合併。

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