Javascript - 具有所有可能组合的字节字符串

时间:2015-10-30 10:37:27

标签: javascript

我有一个字节,其中有一个字节(“00001011”),现在id喜欢得到一个数组,其中所有可能的1(acitve)“位”组合也作为“字节字符串” 所以来自

var bString =“00001011”; //传出字符串

到一个包含所有字符串的数组,其中包含“字符串”的所有可能组合,如“00000001”,“00000011”,“00000010”等等

可能吗?

提前谢谢

3 个答案:

答案 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的组合为10001),20010),40100 )和50101)。

然后就是这个用零填充数字的小技巧:

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,因此只需循环所有值并将它们转换为二进制

&#13;
&#13;
$(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;
&#13;
&#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(); 虽然它是递归,但它具有线性时间复杂度。