问一个&运算符的用法问题 找了好多人都没有解决 
看书时的一个例子(框架程序设计第二版244页)
String file=@"c:\Boot.ini";
FileAttributes att=File.GetAttributes(file);
Console.WriteLine("Is {0} hidden?{1}",file,(att&FileAttributes.Hidden)==FileAttributes.Hidden);
这里的att&FileAttributes.Hidden返回值是Hidden我不太明白这里做&运算怎么返回的Hidden,Boot.ini是系统只读隐藏文件att里面包含Hidden,但是这里不是与运算吗,怎么就选出Hidden来了,哪位大哥帮忙解释下这里的运算流程
msdn上关于&运算符的解释是
“& 运算符既可作为一元运算符也可作为二元运算符。
备注
一元 & 运算符返回操作数的地址(要求 unsafe 上下文)。
为整型和 bool 类型预定义了二进制 & 运算符。对于整型,& 计算操作数的逻辑按位“与”。对于 bool 操作数,& 计算操作数的逻辑“与”;也就是说,当且仅当两个操作数均为 true 时,结果才为 true。 
& 运算符计算两个运算符,与第一个操作数的值无关”
msdn上的说明解释不了这里的问题

解决方案 »

  1.   

    因为这些枚举的值是别人精心设计好的,一般是:
    1 2 4 8 16 32....
    换句话说,每个枚举常量的值都位于不同的位,在进行位运算的时候,不会干扰到别的位
    att&FileAttributes.Hidden
    进行与运算的时候,其他位被清0,而Hidden所在的位保持原样
    所以如果原理有隐藏属性(还可以包含其他属性),与运算后得到的就是隐藏属性(不包含其他属性了,被与运算清0了)
    类似的还有:
    |
    添加某个属性(无论原来是否包含该属性,运算后都包含)
    ^
    反向某个属性(原来有,则删除;原来没有,则添加)关键的问题是枚举的设置要精心安排,只要用前面的设计方法,就能保证这个规律成立
      

  2.   

    这是是位运算.
    如:
    1和2 如果做或|就是 01 |10 得到的结果就是 11 也就是3
    如果做与&运算      01 & 10 结果就是00 也就是0一个数对另一个数做一次&再做一次|就是他自己.这个你可证明.所以这里就很明白了.att&FileAttributes.Hidden)==FileAttributes.Hidden
    如果Att中有hidden属性,那么他必须是做|运算了的,比如att = ??? | FileAttributes.Hidden
    然后再做一次& 就是他自己,所以一般用这个方法来检测
      

  3.   

    所有的枚举都是可以这么做运算的吗?像&、|、^除了在枚举上还有别的奇怪运算吗?我从哪可以看到相关的资料,谢谢
      

  4.   

    越说越糊涂了,Hidden在元数据里的值是2 换成2进制就是10 att是个枚举在这里他有4项值ReadOnly、Hidden、System、Archive元数据里的值分别是1、2、4、32 这里att&FileAttributes.Hidden就是(1,2,4,32)&2吧 这怎么按位与不太明白
      

  5.   

    &运算符是按位“与”的意思,就是把字符转换成二进制来计算,当2位都是1的时候结果是1,其余则为0
    例如5&12
    0101   (expression1)
    1100   (expression2)
    ----
    0100   (result)
      

  6.   

    ls的兄弟 你说这个我明白 可是枚举的怎么进行的呢
    前一个里面有4项值  后一个只有一项
    Hidden在元数据里的值是2 换成2进制就是10 att是个枚举在这里他有4项值ReadOnly、Hidden、System、Archive元数据里的值分别是1、2、4、32 这里att&FileAttributes.Hidden就是(1,2,4,32)&2吧 这怎么按位与不太明白
      

  7.   

    FileAttributes为枚举集合,ReadOnly 为1,二进制为001,Hidden在这里的值为2,其二进制表示就是010,System 为4 (100),下一个为1000,以此类推,其规律为:由低位到高位,仅有一位二进制数值为1,其余为0,即2的n次方。
     
       010    att 如果为Hidden 
      &010    
    -------
       010   这里判断其与FileAttributes.Hidden相等与操作是:只有同为1时为1 而 100  FileAttributes.System 
       &010
    ---------
        000  
    所以,只要两个不同文件属性&操作之后结果均为0,最后的==判断都为false
      

  8.   

    其实就是个位或(|)位与(&)运算符譬如:0100 0000 | 0000 0100 = 0100 0100看看2进制的位运算吧
      

  9.   

    晕,受不了楼主了。FileAttributes实际上是一组位域,att的值,如果文件是只读的那么实际上就是1(FileAttributes.ReadOnly),如果是只读隐藏的,那么实际上就是3(FileAttributes.ReadOnly|FileAttributes.Hidden).怎么回事(1,2,4,32)&2????
      

  10.   

     不太明白,C好久就忘记了,现在做int转字节流,字节流转int也用到这个&,虽然做出来了,是什么意思还是不明白