识别BitValue列中的值

时间:2017-12-20 04:02:34

标签: c# sql asp.net-mvc bit

注意:我不确定如何最好地标题和标记此问题,以便有用的编辑欢迎!

我正在使用数据库第一实体框架向ASP.NET MVC反向设计一个ASP.NET Webforms网站(我没有正确版本的源代码),并且很难理解一个特定的查看/数据集工作。

记录有一个"选项"包含一系列数字的字段,在读取时,识别48个选项中的哪一个为真。我试图弄清楚如何读/写这个结果。

因此,选项表的结构如下: enter image description here 如您所见,有一个BitValue列(继续高达281474976710656);我相信这是我需要用来识别选项的方式,如下所示:5120或17592186044480 如果这个数字只确定了一个选项,我可能会更容易理解这一点,但不幸的是,可以确定几个选项。

例如,记录在其选项字段中有这个:17592186044480 这标识的选项(当我引用现有网站时)是: 过程(BitValue:64) Shore Crew Error(BitValue:17592186044416)

但我不能为我的生活找出这两个数字如何转化为选项字段中的数字!

任何提示?

好的,所以64 + 17592186044416 = 17592186044480这有助于了解数字的生成方式,但是如何对此进行反转以确定构成数字的选项?

结论 我接受了一个答案,结合一些评论,它帮助我找到了解决方案。

最后,我写出了"选项"像这样的枚举......

[Flags] public enum options : long
{
    Master_Pilot_Exchange = 2,
    Bridge_Team_Issues = 4,
    Language_Difficulty = 8,
    Briefing = 16,
    Crew_Competency = 32,
    Procedure = 64,
    Personal_Performance = 128,
    Fatigue = 256,
    ....
}

并创建了一个函数来检查每个选项,看它是否包含在bitValue中:

private bool checkBits(long maskIn, int optionId)
    {
        options mask = (options)maskIn;
        var toCheck = db.InitialReportOptions.Single(i => i.InitialReportOptionID == optionId);
        options chk = (options)toCheck.BitValue;
        bool test = false;
        if ((mask & chk) == chk)
        {
            test = true;
        }
        //
        return test;
    }

当我需要向记录添加新的bitValue时,我使用以下内容:

options newMask = (options)0;
            long bitResult = 0;
            foreach(var option in model.ReportOptions)
            {
                if (option.IsTrue)
                {
                    var bitv = (options)option.BitValue;
                    bitResult = bitResult | ( (long)newMask | (long)bitv);
                }
            }
            model.InitialReportRecord.Options = bitResult;

我敢说这可能会更有效但它确实有效,所以我很高兴!

1 个答案:

答案 0 :(得分:2)

首先,您需要知道48个标志中每个标志的位值......然后在C#...

const int Procedure = 64

if ((myData.InitialReportOption & Procedure) == Procedure)
   // Then Procedure flag is active
else  // (myData.InitialReportOption & Procedure) == 0
   // Procedure is not active

同样地,你可以做...

myData.InitialReportOption |= Procedure;

并禁用

myData.InitialReportOption &= ~Procedure;

欲了解更多信息,请尝试此博客...

http://blog.typps.com/2007/10/bitwise-operators-in-c-or-xor-and-not.html