算法,位运算,高手请进
用一个枚举来表示对象的多个属性,并保存到一个字段中。
AttrMulti = 0x00000001,
AttrRequired = 0x00000002,
AttrKeep = 0x00000004,
AttrEditable = 0x00000008,
AttrSort = 0x00000010,
比如:如果字段的值是6 = 2+4,则AttrRequired ,AttrKeep 被选中。
如何写一个算法根据字段的值,得到哪个属性被选?
在考虑用位运算
------解决方案--------------------if ((Value & AttrMulti) == AttrMulti) ....
------解决方案--------------------if ((Value &(int)枚举变量)> 0)
{
....ok
}
------解决方案--------------------AttrRequired = 0x00000002,
AttrKeep = 0x00000004,
如果 int a = 6;
00000110
比如 a1 - a8 为 复选框!!!
bool a1;bool a2;bool a3;bool a4;bool a5;bool a6;bool a7;bool a8;
a8 = (a & 0x01) == 1
a7 = (a > > 1 & 0x01) == 1 ;
a6 = (a > > 2 & 0x01) == 1 ;
a5 = (a > > 3 & 0x01) == 1
a4 = (a > > 4 & 0x01) == 1 ;
a3 = (a > > 5 & 0x01) == 1 ;
this.chkk1.Checked = (var > > 15 & 0x01) != 0;
this.chkk2.Checked = (var > > 14 & 0x01) != 0;
this.chkk3.Checked = (var > > 13 & 0x01) != 0;
this.chkk4.Checked = (var > > 12 & 0x01) != 0;
this.chkk5.Checked = (var > > 11 & 0x01) != 0;
this.chkk6.Checked = (var > > 10 & 0x01) != 0;
this.chkk7.Checked = (var > > 9 & 0x01) != 0;
this.chkk8.Checked = (var > > 8 & 0x01) != 0;
this.chkk9.Checked = (var > > 7 & 0x01) != 0;
this.chkk10.Checked = (var > > 6 & 0x01) != 0;
this.chkk11.Checked = (var > > 5 & 0x01) != 0;
this.chkk12.Checked = (var > > 4 & 0x01) != 0;
this.chkk13.Checked = (var > > 3 & 0x01) != 0;
this.chkk14.Checked = (var > > 2 & 0x01) != 0;
this.chkk15.Checked = (var > > 1 & 0x01) != 0;
反算也可以哦
Utility.Feedback.NotifyHex = (byte)(this.chk1.Checked? 128:0);
Utility.Feedback.NotifyHex += (byte)(this.chk2.Checked? 64:0);
Utility.Feedback.NotifyHex += (byte)(this.chk3.Checked? 32:0);
Utility.Feedback.NotifyHex += (byte)(this.chk4.Checked? 16:0);
Utility.Feedback.NotifyHex += (byte)(this.chk5.Checked? 8:0);
Utility.Feedback.NotifyHex += (byte)(this.chk6.Checked? 4:0);
Utility.Feedback.NotifyHex += (byte)(this.chk7.Checked? 2:0);
Utility.Feedback.NotifyHex += (byte)(this.chk8.Checked? 1:0);
------解决方案--------------------楼主你的问题首先应该是可以将枚举作为位域(即一组标志)处理。
首先定义的枚举要满足下面两个条件:
1.要想实现可以将枚举作为位域(即一组标志)处理,枚举值必须保证组合的枚举常量中的各个标志都不重叠,我推荐你用 2 的幂(即 1、2、4、8 等)定义枚举常量。
2.定义的枚举需要用FlagsAttribute来修饰。
然后我们再来看你的问题。
下面这个函数会返回一个字符串,这个字符串中用“,”分割了选中各枚举的名字。调用的时候参数必须是合法的值否则会返回参数.ToString()。
private string GetValueName(int para)
{
return Enum.Format(typeof(Attr), para, "G ");//假设 "Attr "是你定义的枚举