将条件表示为公式

时间:2015-12-05 18:46:02

标签: c bit-manipulation

这种情况是我正在处理的代码的一部分:

// All are Bitvector of length 4
node[i], V1, V2, V3;

我正在尝试确保node [i]不应包含任何其他三个向量,即V1,V2和V3。 例如,假设V11001V20111V30011

我能想到的一个微不足道的方式是将其表述为(node[i] & V1) != V1,并将其与其他方式相似。

我正在考虑将其表示为一个公式/子句,这将有助于优化我的代码。因为我在整个可能的V上迭代,然后逐个检查节点。

  

还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

  1. 而不是

    (((node[i] & V1) != V1) && 
     ((node[i] & V2) != V2) && 
     ((node[i] & V3) != V3))
    
  2. 使用以下设置,匹配node[i]的任何V2都匹配V3,因此只需要进行2次测试。

     V1 is 1001, V2 is 0111, V3 is 0011
    
        (((node[i] & V1) != V1) && 
         ((node[i] & V2) != V2))
    

    当然,需要哪些测试因V1, V2, V3而异。

    详细信息:请参阅Karnaugh Map

    1. 仅使用4位向量,预先计算valid[]表。在precompute()中,按原始(((node[i] & V1) != V1) && ...测试检查所有16种组合。

      bool valid[1u<<4];
      precompute(valid, V1, V2, V3);
      
      loop
         if (valid[node[i]]) ...