这种情况是我正在处理的代码的一部分:
// All are Bitvector of length 4
node[i], V1, V2, V3;
我正在尝试确保node [i]不应包含任何其他三个向量,即V1,V2和V3。
例如,假设V1
为1001
,V2
为0111
,V3
为0011
。
我能想到的一个微不足道的方式是将其表述为(node[i] & V1) != V1
,并将其与其他方式相似。
我正在考虑将其表示为一个公式/子句,这将有助于优化我的代码。因为我在整个可能的V上迭代,然后逐个检查节点。
还有更好的方法吗?
答案 0 :(得分:1)
而不是
(((node[i] & V1) != V1) &&
((node[i] & V2) != V2) &&
((node[i] & V3) != V3))
使用以下设置,匹配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
仅使用4位向量,预先计算valid[]
表。在precompute()
中,按原始(((node[i] & V1) != V1) && ...
测试检查所有16种组合。
bool valid[1u<<4];
precompute(valid, V1, V2, V3);
loop
if (valid[node[i]]) ...