我想創建一個X長度的位掩碼數組,並且正在尋找一個有效的函數。如何在javascript中生成X長度的每個位掩碼
對於長度3我想它產生:
000, 001, 010, 011, 100, 101, 110, 111
我要尋找一個使用位數學這樣做的解決方案 - 現在我只是使用普通的for循環爲我的位運算是簡陋。
我想創建一個X長度的位掩碼數組,並且正在尋找一個有效的函數。如何在javascript中生成X長度的每個位掩碼
對於長度3我想它產生:
000, 001, 010, 011, 100, 101, 110, 111
我要尋找一個使用位數學這樣做的解決方案 - 現在我只是使用普通的for循環爲我的位運算是簡陋。
你嘗試以下方法:
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);
我希望有所幫助。
這只是這樣的:
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個
希望這有助於。乾杯
這是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;
}
這只是從0到2的數字^ n-1個 – Barmar
@Barmar是的,我顯然這得太多:) – cyberwombat