【问题标题】:Generating all possible true/false combinations生成所有可能的真/假组合
【发布时间】:2017-02-05 16:32:12
【问题描述】:

我想创建一个包含三个变量的所有可能组合的数组,这些变量可以为真或假(即 8 种可能的组合)。

我正在尝试在这张图片的左上角创建立方体

所以输出应该是这样的

points = [
  // first square
  {
    id: '000',
    truths: [false, false, false]
    position: [0, 0]
  },
  {
    id: '100',
    truths: [true, false, false]
    position: [5, 0]
  },
  {
    id: '010',
    truths: [false, true, false]
    position: [0, 5]
  },
  {
    id: '110',
    truths: [true, true, false]
    position: [5, 5]
  },
  // second square
  {
    id: '001',
    truths: [false, false, true]
    position: [2.5, 2.5]
  },
  {
    id: '101',
    truths: [true, false, true]
    position: [7.5, 2.5]
  },
  {
    id: '011',
    truths: [false, true, true]
    position: [2.5, 7.5]
  },
  {
    id: '111',
    truths: [true, true, true]
    position: [7.5, 7.5]
  },
];

lines = [
  { from: '000', to: '100' },
  { from: '000', to: '010' },
  { from: '000', to: '001' },

  { from: '100', to: '101' },
  { from: '100', to: '110' },

  { from: '001', to: '101' },
  { from: '001', to: '011' },

  { from: '101', to: '001' },
  { from: '101', to: '111' },

  ...
]

我不知道如何遍历所有可能的真值并创建这些点。

一种方法是使用 for 循环

for (var i=0; i<Math.pow(2, 3); i++) {
  ...
}

但这并不能帮助我分配可能的真值。

【问题讨论】:

  • 有 2^n 个可能的值。如果你不想使用嵌套的 for 循环(你真的不应该),那么提取整数 0...2^n 的位。 truths 中的 n 值将是整数的位。
  • 我只是不明白如果您的订单是 0、4、2、3、1、5、7、8,二进制方法将如何帮助您。为什么不只使用数字。
  • @Redu 我不明白你在说什么。顺序无关紧要。所有从 0 到 8 的整数将代表 3 位,对应于 OP 类比中的 truths 数组。 2^n 个整数 = 2^n truths 数组。在二进制中,数字可以被认为是位的“数组”:0=[0,0,0], 1=[0,0,1], 2=[0,1,0], 3=[0,1 ,1], 4=[1,0,0] , 5=[1,0,1], 6=[1,1,0], 7=[1,1,1]。

标签: javascript arrays boolean combinations truthtable


【解决方案1】:

计算机中的一切都已经是二进制的。你不需要任何花哨的Math.pow 或类似的东西。

for (let i = 0; i < 1 << 3; i++) {
  console.log([!!(i & (1<<2)), !!(i & (1<<1)), !!(i & 1)]);
}

虽然这看起来又好又短,但我实际上并不喜欢 !! 或幻数。不过,在编写 sn-ps 时,我总是喜欢这些技巧。因此将尝试给出一个稍微干净的版本:

const AMOUNT_OF_VARIABLES = 3;

for (let i = 0; i < (1 << AMOUNT_OF_VARIABLES); i++) {
  let boolArr = [];
  
  //Increasing or decreasing depending on which direction
  //you want your array to represent the binary number
  for (let j = AMOUNT_OF_VARIABLES - 1; j >= 0; j--) {
    boolArr.push(Boolean(i & (1 << j)));
  }
  
  console.log(boolArr);
}

【讨论】:

  • 嗨,只是出于好奇而问... 0 (for let i = 0;) 是否等于二进制 0?和1 &gt;&gt;&gt; 1一样吗?
  • 0 真的是零。只是这样看,javascript 二元运算符“好像”在 32 位整数上工作,我们只使用三个位:000、001、010、011、100、101、111。只是省略了前 29 个零,我们不'不在乎那些。
  • 好的,感谢您的澄清!我习惯了类似 C 的东西(我通常使用 \0),所以有时我会感到困惑。
  • @AlejandroIván 但请注意1 &gt;&gt;&gt; 1 === 0
【解决方案2】:

这很简单,只需将所有从 0 到 2**n-1 的整数转换为二进制:

var n = 3,
    m = 1 << n;
for (var i = 0; i < m; i++) {
    var s = i.toString(2); // convert to binary
    s = new Array(n + 1 - s.length).join('0') + s; // pad with zeroes
    console.log(s);
}

上面的代码是通用的;您可以将n 更改为您想要的位数。

【讨论】:

    【解决方案3】:

    pow(2, n) 可能的值。

    在二进制数系统中,数字可以简单地被认为是位的“数组”:0=[0,0,0], 1=[0,0,1], 2=[0,1,0], 3=[0,1,1], 4=[1,0,0] , 5=[1,0,1], 6=[1,1,0], 7=[1,1,1]

    按照这个想法,最简单的方法是提取整数[0, pow(2, n) - 1]的位。以下是上述想法的直接实现代码:

    function test()
    {
       var n = 3;
       var k = (1 << n); // bit trick for pow(2, n)
    
       var truths = [];
    
       for (var i = 0; i < k; ++i)
       {
          truths[i] = [];
    
          for (var j = 0; j < n; ++j)
          {
             var value = (i >> j) & 1; // extract the j-th bit of i
             truths[i][j] = value;
          }
    
          console.log(truths[i]);
       }
    }
    

    【讨论】:

      【解决方案4】:

      const boolCombo = size => {
        const buf = Array(1 << size)
        for (let i = buf.length; i--;) {
          buf[ i ] = Array(size)
          for (let j = size; j--;)
            buf[ i ][ j ] = +!!(i & 1 << j)
        }
        return buf
      }
      
      console.log(boolCombo(3))

      【讨论】:

        【解决方案5】:

        #include

        #include

        int main()

        {

        int n, c, k,arr[100],m,i;

        scanf("%d", &n);

        m=pow(2,n);

        for(i=0;i

        arr[i]=i;

        for(i=0;i

        {

        对于 (c = n-1; c >= 0; c--)

        {

        k = arr[i] >> c;

        如果 (k & 1)

        printf("真");

        其他

        printf("假");

        }

        printf("\n");

        }

        返回 0;

        }

        【讨论】:

        • 欢迎来到 StackOverflow。请查看how to answer questions
        • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
        • 虽然此代码可能会解决问题,但 including an explanation 关于如何以及为何解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的答案添加解释并说明适用的限制和假设。
        猜你喜欢
        • 2016-01-07
        • 2022-01-18
        • 2022-08-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多