日期:2014-05-19  浏览次数:21106 次

算法,位运算,高手请进
用一个枚举来表示对象的多个属性,并保存到一个字段中。
                            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 "是你定义的枚举