繁体   English   中英

使用位掩码查找C#中int的已用排列?

[英]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);

但这似乎会产生一个最终等于所有随后生成的蒙版的蒙版。 所以这行不通。

可以这样工作吗? 检查一组整数(无论它们的排列方式)是否已被处理的最有效方式是什么?

  1. 位掩码是通过移位生成的

     int mask = (1 << int0) & (1 << int1) & (1 << int2) & (1 << int3); 
  2. HashSet.Add将检查该项目是否存在, Contains是否冗余。

     if(checkHashSet.Add(mask)) //int set has not been processed, add mask and process else // int set already came, skip 
  3. 如果整数大于31,则可以使用longulong ;如果大于64,则使用2 longBigInteger

对于您的问题“是否有更好的方法”。 我想可能是。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM