我有一个字节,其中有一个字节(“00001011”),现在id喜欢得到一个数组,其中所有可能的1(acitve)“位”组合也作为“字节字符串” 所以来自
var bString =“00001011”; //传出字符串
到一个包含所有字符串的数组,其中包含“字符串”的所有可能组合,如“00000001”,“00000011”,“00000010”等等
可能吗?
提前谢谢
答案 0 :(得分:2)
function combinations( input ){
var number = parseInt( input, 2 );
var combinations = [];
var zeroes = (new Array(input.length)).join(0);
for(var i=1;i<=number;i++){
if((i&number) == i){ combinations.push( i ) }
}
return combinations.map( function(dec){
return (zeroes + dec.toString(2)).substr( -zeroes.length-1 );
});
}
http://jsfiddle.net/jkf7pfxn/3/
console.log( combinations("00001011") );
// ["00000001", "00000010", "00000011", "00001000", "00001001", "00001010", "00001011"]
这个想法如下:将所有数字从1迭代到输入数字。如果当前数字AND输入数字返回当前数字,则两者在同一位置都有1
位。
在较小的数字"0101"
(5
)上,其工作原理如下:
1 & 5 == 1
,(000 1 &amp; 010 1 )将1
推送到比赛。
2 & 5 == 0
,(00 1 0&amp; 01 0 1)无匹配。
3 & 5 == 1
,(00 1 1&amp; 01 0 1)无匹配。
4 & 5 == 4
,(0 1 00&amp; 0 1 01)将4
推送到匹配项。
5 & 5 == 5
,(0 1 0 1 &amp; 0 1 0 1 )推送5
比赛。
因此0101
的组合为1
(0001
),2
(0010
),4
(0100
)和5
(0101
)。
然后就是这个用零填充数字的小技巧:
var zeroes = (new Array(input.length)).join(0); // gives a long enough string of zeroes
然后
// convert to base 2, add the zeroas at the beginning,
// then return the last n characters using negative value for substring
return (zeroes + dec.toString(2)).substr( -1 * zeroes.length);
答案 1 :(得分:0)
由于11111111
为255,因此只需循环所有值并将它们转换为二进制
$(document).ready(function() {
for (var i = 0; i < 256; i++) {
$('#core').append('<div>' + dec2bin(i) + '</div>');
}
function dec2bin(dec) {
return ('00000000' + (dec >>> 0).toString(2)).slice(-8);
}
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='core'></div>
&#13;
答案 2 :(得分:0)
如果要枚举二进制数的所有组合,其中id
只能在模式的位置,您可以编写一个简单的递归函数:
1
此算法适用于任何长度的var input = "00010111";
var current = [];
function combinations()
{
if (input.length === current.length)
{
var output = current.join('');
if (parseInt(output, 2) !== 0) // exclude all-zeroes case
document.body.innerHTML += output + "<br/>";
return;
}
current.push('0');
combinations();
current.pop();
if (input[current.length - 1] === '1')
{
current.push('1');
combinations();
current.pop();
}
}
combinations();
虽然它是递归,但它具有线性时间复杂度。