如何判断一个集合中是否包含二进制数,该集合中的某个元素可能不关心位? 我考虑过使用哈希表,但是需要在哈希表中使用无关位来复制数字,以便涵盖所有可能性。
例如: 这组数字是:
0 00x1
1 10xx
2 110x
3 1010
4 11x1
5 0010
且数字为0011,结果应为0。
答案 0 :(得分:3)
如果二进制数的位数有限,那么您可以复制那些不关心位并将二进制数转换为整数,然后将这些整数用作映射的键和其他值作为值。 实施例
0 00x1
1 10xx
可以转换为
0001 0
0011 0
1000 1
1001 1
1010 1
1011 1
并保存为
我j
1 0
3 0
8 1
9 1
10 1
11 1
其中i是键,j是值
答案 1 :(得分:2)
假设您有二进制数1xxx,它将匹配8个数字。所以,不要为每个选项复制。
你必须在某处保留“不关心”位。使用另一个数字,将“不关心”位设置为1.如果我们重复您的示例:
i x y
0 00x1 0010
1 10xx 0011
2 110x 0001
3 1010 0000
4 11x1 0010
5 0010 0000
您需要决定使用x,0或1的内容。您可以使用其中任何一个,一旦将信息保存在第二个数字中就没关系。
现在使用按位操作:
if ((n ^ x[i]) | y[i]) == y[i] then match
此解决方案基于检查除了无关位之外是否存在任何非匹配位。 (n xor x [i])给出非匹配位,然后或者用y [i]不应该与y [i]不同。
如果我们回顾一下你的例子,假设你为x选择0,则检查变为
i:0 -->> ((0011 ^ 0001) | 0010) == 0010 -->> match!
i:1 -->> ((0011 ^ 1000) | 0011) != 0011 -->> no match!
i:2 -->> ((0011 ^ 1100) | 0001) != 0001 -->> no match!
i:3 -->> ((0011 ^ 1010) | 0000) != 0001 -->> no match!
i:4 -->> ((0011 ^ 1101) | 0010) != 0001 -->> no match!
i:5 -->> ((0011 ^ 0010) | 0000) != 0000 -->> no match!