让我先描述一下我的处境。
我有一个十六进制值列表,叫做baseid。它们的选择是这样的:逻辑的或任意数目之间的,都会给你一个唯一的ID,称为FinalID也就是说,我的baseid值如下。
baseid={0x01、0x02、0x04、0x08、0x10,…}
关键的一点是,我不知道在运行程序之前我将拥有多少个baseid(当程序从文件中读取时,我运行程序后会得到一个baseid列表),或者baseid总数中有多少将用于创建finalid。这是根据我的计划的其他部分决定的。例如,下面是我的程序中可能包含的两个终结符。
FinalID=(0x01 | 0x04)=0x05
finalid=(0x02 0x04 0x10)=0x16
现在,对任意数量的baseid使用或操作是很容易的。我的问题是,我需要从finalid中提取用于创建finalid的baseid。因为我选择了baseid,所以一旦使用or操作,它们总是会给我一个唯一的finalid,所以我知道任何给定的finalid都是使用一组特定的baseid创建的。请注意,FinalID也只能使用一个BaseID创建,这相当于FinalID=(BaseID | 0x00)。
我知道如何提取用于创建任何特定finalid的baseid;我必须得到所涉及的baseid的完整列表,然后在每个元素组合中使用or运算符,以确定哪个组合给出了特定finalid。
但是我发现很难把这个逻辑转换成一个程序。我在.NET3.5框架中使用C如有任何建议/想法,将不胜感激。代码示例非常受欢迎。
提前谢谢!
最佳答案
好吧,你有一个口罩你只需要“和”你的finalid和每个可能的baseid-如果结果是非零的,那么baseid贡献给finalid:
// Or just go from 0... count and use 1 << x
foreach (int baseId in BaseIDs)
{
if ((baseId & finalId) != 0)
{
...
}
}
我还建议您使用一个“flags”枚举,这将使您的生活在语言集成方面更简单。
关于c# - 反向或算法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7764876/