问一个&运算符的用法问题 找了好多人都没有解决
看书时的一个例子(框架程序设计第二版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上的说明解释不了这里的问题
看书时的一个例子(框架程序设计第二版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上的说明解释不了这里的问题
解决方案 »
- ActiveReports For.NET3.0安装成功却在VS2008新增中找不到?
- 为什么不直接if(PropertyChanged != null),而要handler=this.PropertyChanged, 再检查handler的值?
- 用c#修改图片曝光度的方法
- 如何取出字符串中的特定字符
- 【在线等】这段简单的C#程序哪里错了?
- nhibernate查询常量的问题
- Clr封装C++问题,急!!!高手来看!
- 关于网站发布问题
- 怎样在两个窗口之间传递数据
- 学校要整一个P2P的项目纠结用REMOTING还是SOCKET
- 调用google chart参数字符串太长(超过2048)有什么办法解决
- 正则表达式 在线等
1 2 4 8 16 32....
换句话说,每个枚举常量的值都位于不同的位,在进行位运算的时候,不会干扰到别的位
att&FileAttributes.Hidden
进行与运算的时候,其他位被清0,而Hidden所在的位保持原样
所以如果原理有隐藏属性(还可以包含其他属性),与运算后得到的就是隐藏属性(不包含其他属性了,被与运算清0了)
类似的还有:
|
添加某个属性(无论原来是否包含该属性,运算后都包含)
^
反向某个属性(原来有,则删除;原来没有,则添加)关键的问题是枚举的设置要精心安排,只要用前面的设计方法,就能保证这个规律成立
如:
1和2 如果做或|就是 01 |10 得到的结果就是 11 也就是3
如果做与&运算 01 & 10 结果就是00 也就是0一个数对另一个数做一次&再做一次|就是他自己.这个你可证明.所以这里就很明白了.att&FileAttributes.Hidden)==FileAttributes.Hidden
如果Att中有hidden属性,那么他必须是做|运算了的,比如att = ??? | FileAttributes.Hidden
然后再做一次& 就是他自己,所以一般用这个方法来检测
例如5&12
0101 (expression1)
1100 (expression2)
----
0100 (result)
前一个里面有4项值 后一个只有一项
Hidden在元数据里的值是2 换成2进制就是10 att是个枚举在这里他有4项值ReadOnly、Hidden、System、Archive元数据里的值分别是1、2、4、32 这里att&FileAttributes.Hidden就是(1,2,4,32)&2吧 这怎么按位与不太明白
010 att 如果为Hidden
&010
-------
010 这里判断其与FileAttributes.Hidden相等与操作是:只有同为1时为1 而 100 FileAttributes.System
&010
---------
000
所以,只要两个不同文件属性&操作之后结果均为0,最后的==判断都为false