我正在尝试为给定位宽内的一对 1 生成所有可能的组合。
假设位宽为 6,即数字 32。这就是我想要生成的:
000000
000011
000110
001100
001111
011000
011011
011110
110000
110011
110110
111100
111111
如果我有变量:
var a = 1,
b = 2;
num = a | b;
并创建一个循环,我会随着width - 1
时间的推移循环,在我移动 和a << 1
的地方b << 1
,我会得到一对的所有组合。在那之后,我几乎被困住了。
有人可以请提供一些帮助。
更新:工作示例
基于 Barmar 的数学方法,这是我设法实现的
var arr = [],
arrBits = [];
function getCombs(pairs, startIdx) {
var i, j, val = 0, tmpVal, idx;
if (startIdx + 2 < pairs) {
startIdx = arr.length - 1;
pairs -= 1;
}
if (pairs < 2) {
return;
}
for (i = 0; i < pairs-1; i++) {
idx = startIdx - (i * 2);
val += arr[idx];
}
for (j = 0; j < idx - 1; j++) {
arrBits.push((val + arr[j]).toString(2));
}
getCombs(pairs, startIdx-1);
}
(function initArr(bits) {
var i, val, pairs, startIdx;
for (i = 1; i < bits; i++) {
val = i == 1 ? 3 : val * 2;
arr.push(val);
arrBits.push(val.toString(2));
}
pairs = Math.floor(bits / 2);
startIdx = arr.length - 1;
getCombs(pairs, startIdx);
console.log(arrBits);
}(9));
JSFiddle 上的工作示例
http://jsfiddle.net/zywc5/