反向OR算法?

Sac*_*ach 2 c# algorithm hex logical-operators

我先来描述一下我的情况.

我有一个十六进制值列表,称为BaseID.选择它们使得任意数量的逻辑OR将为您提供一个名为FinalID 的唯一ID.也就是说,我的BaseID值如下.

BaseID = {0x01,0x02,0x04,0x08,0x10,...}

关键的一点是,我不知道在运行程序之前我将拥有多少个BaseID (一旦我从文件中读取程序时运行程序,我会得到一个BaseID列表),或者有多少个BaseID的总数将用于创建FinalID.它是根据我的程序的其他部分决定的.例如,以下是我的程序中可能有的两个FinalID.

FinalID =(0x01 | 0x04)= 0x05

FinalID =(0x02 | 0x04 | 0x10)= 0x16

现在,对任意数量的BaseID使用OR运算都很容易.我的问题是,我需要从FinalID中提取用于创建FinalID的BaseID.由于我选择了BaseID,因此一旦使用OR操作,它们总是会给我一个唯一的FinalID,我知道任何给定的FinalID都是使用一组特定的BaseID创建的.请注意,也可以仅使用一个BaseID创建FinalID,它相当于FinalID =(BaseID | 0x00).

我知道我需要做些什么来提取用于创建任何特定FinalID的BaseID; 我必须得到所涉及的BaseID的完整列表,然后在每个元素的comibnation中使用OR运算符来确定哪个组合给出了特定的FinalID.

但是我发现很难将这个逻辑转换成一个程序.我在.NET 3.5 Framework中使用C#.任何建议/想法将非常感谢.代码示例非常受欢迎.

提前致谢!

Jon*_*eet 7

好的,所以你有一个位掩码......所有你需要做的就是"和"你的FinalID与每个可能的BaseID - 如果结果非零,那么BaseID贡献给了FinalID:

// Or just go from 0... count and use 1 << x
foreach (int baseId in BaseIDs)
{
    if ((baseId & finalId) != 0)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我还建议您可以使用"flags"枚举,这将使您的语言集成更简单.