注意:我不确定如何最好地标题和标记此问题,以便有用的编辑欢迎!
我正在使用数据库第一实体框架向ASP.NET MVC反向设计一个ASP.NET Webforms网站(我没有正确版本的源代码),并且很难理解一个特定的查看/数据集工作。
记录有一个"选项"包含一系列数字的字段,在读取时,识别48个选项中的哪一个为真。我试图弄清楚如何读/写这个结果。
因此,选项表的结构如下: 如您所见,有一个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;
我敢说这可能会更有效但它确实有效,所以我很高兴!
答案 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