2013-10-23 45 views
0

给定n变量我想创建小数点,它等于真值表中的所有可能的二进制变化。例如生成真值表小数的公式

对于abc令:

a = 11110000 (240) 
b = 11001100 (204) 
c = 10101010 (170) 

对于pq令:

p - 1100 (12) 
q - 1010 (10) 

我已经摸索出公式中的任何一组创建的第一个数字,就像这样:

n = number of variables 
x = 2^n 

decimal = (2^x) - (2^(x/2)); 

我已经用JavaScript实现这个像这样:

var vars = ["a", "b", "c"]; 
var bins = []; 

for (var i = 0; i < vars.length; i++) { 
    var rows = 1 << vars.length; 
    bins[i] = (1 << rows) - (1 << ((rows)/2)); 
    console.log(bins[i].toString(2)); // logs 11110000 
} 

我不知道如何来计算数字的休息,没有人知道一个公式来做到这一点?

+0

,如果你从0横扫小数到n了toString(2)转换应该打沿途每一个可能的组合。 – dandavis

+0

@dandavis这是行不通的。二进制中的0-3是“00”,“01”,“10”,“11”。当然,我可以很容易地写出这个交替的1和0,但是计算时间呈指数级增长,这并不好。我想找到一个数学公式,这意味着我不必创建怪异的大循环。 –

回答

0

我发现了一个解决方案,但它确实需要一个嵌套循环,这并不理想,因为它意味着随着vars数组的增长,计算时间呈指数级增长。

我开始认为这是不可能没有循环。

这是我的最终代码。我不知道如何将它写成一个数学公式,所以我不打扰。

var vars = ["a", "b", "c"]; 
var bins = []; 

for (var i = 0; i < vars.length; i++) { 
    var rows = 1 << vars.length; 
    var max = (1 << rows) - 1; 
    var diff = (1 << ((rows)/(2 << i))) - 1; 
    var output = max - diff; 

    var iterations = (1 << i); 
    var step = 1 << (vars.length - i); 
    for (var j = 1; j < iterations ; j++) { 
     output -= (diff << (step * j)); 
    } 

    bins[i] = output; 

    console.log(bins[i].toString(2)); 
} 

http://jsfiddle.net/RbPVx/1/