[英]Using bitmask to look up used arrangements of ints in C#?
我很少使用位掩码,而是试图使其更加熟悉。 我了解它们的各种基本用法。 据我了解他们应该可以工作,但似乎不起作用。
我有一个用例,其中有四个可能以不同排列方式出现的int,并且我需要检查当前的int排列是否已经作为不同的排列来过。
So one iteration they might come as:
2, 5, 10, 8
Next iteration:
1, 0, 2, 5
Now on the next iteration if this comes:
0, 1, 2, 5
它需要辨别出最后一组已经以不同的方式出现并跳过它。
我想知道,我可以根据这些整数创建一个遮罩,然后将它们放入HashSet中吗,那么我可以轻松查找该整数集合是否已经存在?
基本上我是这样做的:
int mask = int0 & int1 & int2 & int3;
if (checkHashSet.Contains(mask))
return; // int set already came, skip
//int set has not been processed, add mask and process
checkHashSet.Add(mask);
但这似乎会产生一个最终等于所有随后生成的蒙版的蒙版。 所以这行不通。
可以这样工作吗? 检查一组整数(无论它们的排列方式)是否已被处理的最有效方式是什么?
位掩码是通过移位生成的
int mask = (1 << int0) & (1 << int1) & (1 << int2) & (1 << int3);
HashSet.Add
将检查该项目是否存在, Contains
是否冗余。
if(checkHashSet.Add(mask)) //int set has not been processed, add mask and process else // int set already came, skip
如果整数大于31,则可以使用long
或ulong
;如果大于64,则使用2 long
或BigInteger
对于您的问题“是否有更好的方法”。 我想可能是。
1)对输入进行排序,并保留已经视为字符串的条目映射。 这接近您的建议,但更易于阅读和实现。
2)具有int[1000]
键的映射比位掩码更容易。 在处理输入时,对于找到的每个数字,增加数组++array[n]
。 然后,您可以使用array[]
作为键将其添加到地图中。 如果您之前看过特定的组合,则可以搜索地图进行计算。
3)1 << n仅适用于此,因此您需要将int数组作为适当的掩码来执行。 array [n / 64]&(1 <<(n%64))之类的。 对于嵌入式来说,这是一个很好的解决方案,但是通常很难理解。 同样,如果重复任何数字,它将也不可靠,因为位只能标记一个事件。 或按照Shingo的答案使用BigInteger。
我个人会去第一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.