【问题标题】:Formula for generating truth table decimals生成真值表小数的公式
【发布时间】:2013-10-23 15:07:31
【问题描述】:

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

对于a,bc 让:

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));

我已经在 J​​avaScript 中这样实现了:

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 扫描到 n,则 toString(2) 转换应该会击中所有可能的组合。
  • @dandavis 这行不通。二进制中的 0 - 3 为 00011011。当然,我可以很容易地写出交替的 1 和 0,但是计算时间呈指数增长,这并不好。我想找到一个数学公式,这意味着我不必创建非常大的循环。

标签: javascript binary formula truthtable


【解决方案1】:

我找到了一个解决方案,但是它确实需要一个嵌套循环,这并不理想,因为这意味着计算时间会随着 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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 2010-10-31
    • 2016-03-22
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多