用一个枚举来表示对象的多个属性,并保存到一个字段中。
              AttrMulti = 0x00000001,              AttrRequired = 0x00000002,              AttrKeep = 0x00000004,            AttrEditable = 0x00000008,            AttrSort = 0x00000010,比如:如果字段的值是6 = 2+4,则AttrRequired ,AttrKeep 被选中。
如何写一个算法根据字段的值,得到哪个属性被选?
在考虑用位运算

解决方案 »

  1.   

    if ((Value & AttrMulti) == AttrMulti) ....
      

  2.   

    不太明白
    如果字段值是12
    怎么判断那个被选中了是AttrKeep和AttrEditable 还是AttrSort和AttrRequired
      

  3.   

    if ((Value &(int)枚举变量)>0)
    {
      ....ok
    }
      

  4.   

    我测试了一下
    if (((long)FieldAttribute.AttrEditable & Convert.ToInt64(this.textBox1.Text))== (long)FieldAttribute.AttrEditable)
    {
    MessageBox.Show("AttrEditable");
    }
    结果没问题,但是对这个算法理解不好,能否讲解一下
      

  5.   

    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);
      

  6.   

    如果 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 ;
    看 0 1就行了。管他 16进制还是2进制,还是 10进制,他是整数,所以就按照整数的算法算就可以了。只是表示方法不同而已,写法不同
      

  7.   

    我刚才也没注意,呵呵。
    把字段的值转换成二进制因该是00000-11111之间
    一次对应AttrSort,AttrEditable ,AttrKeep ,AttrRequired,AttrMulti       
    那么几可以判断对应位,0就是没选中,1就是选中了
      

  8.   

    楼主你的问题首先应该是可以将枚举作为位域(即一组标志)处理。
    首先定义的枚举要满足下面两个条件:
    1.要想实现可以将枚举作为位域(即一组标志)处理,枚举值必须保证组合的枚举常量中的各个标志都不重叠,我推荐你用 2 的幂(即 1、2、4、8 等)定义枚举常量。
    2.定义的枚举需要用FlagsAttribute来修饰。然后我们再来看你的问题。
    下面这个函数会返回一个字符串,这个字符串中用“,”分割了选中各枚举的名字。调用的时候参数必须是合法的值否则会返回参数.ToString()。
    private string GetValueName(int para)
    {
      return Enum.Format(typeof(Attr), para, "G");//假设"Attr"是你定义的枚举
    }