这个C#运算符在这个代码段中是如何工作的?
我在SO上找到了这个代码段(很抱歉,我没有到问答组合的链接) 这让我很困惑,因为这个C#运算符在这个代码段中是如何工作的?,c#,syntax,operators,bit-manipulation,bitwise-operators,C#,Syntax,Operators,Bit Manipulation,Bitwise Operators,我在SO上找到了这个代码段(很抱歉,我没有到问答组合的链接) 这让我很困惑,因为FileAttributes.Directory位于=的两侧 在这种情况下,&做什么?我不知道怎么读这行代码。我正在尝试评估路径字符串是文件还是目录。单个&是位运算符。 它对两个值的各个位执行按位AND。它在位掩码中被大量使用。它执行位AND操作。属性存储为位标志,因此它将这些标志与AttributeFlags.Directory一起进行and'运算,以查看其中一个属性是否为.Directory 这里是位标志的好例
FileAttributes.Directory
位于=
的两侧
在这种情况下,
&
做什么?我不知道怎么读这行代码。我正在尝试评估路径字符串是文件还是目录。单个&是位运算符。
它对两个值的各个位执行按位AND。它在位掩码中被大量使用。它执行位AND操作。属性存储为位标志,因此它将这些标志与AttributeFlags.Directory一起进行and'运算,以查看其中一个属性是否为.Directory 这里是位标志的好例子: 然后:
0100与目录标志相同,因此我们现在知道该标志位于枚举的所选标志中。
&
在本例中是按位和
运算符。它是。在此特定示例中,它检查枚举是否具有目录值,验证源
变量所指向的字符串是否为目录。它使用位掩码测试是否设置了单个位(FileAttributes.Directory)
枚举的值是2的幂,对应于单个位
ReadOnly = 1,
Hidden = 2,
System = 4,
Directory = 16,
Archive = 32,
Device = 64,
如果设置了ReadOnly和Directory,则FileAttributes等于17。在二进制中,计算如下所示:
File.GetAttributes(source) = 00001001
FileAttributes.Directory = 00001000 &
-------------------------------------
00001000
如果未设置目录位,则会得到零:
File.GetAttributes(source) = 00000001
FileAttributes.Directory = 00001000 &
-------------------------------------
00000000
编写具有相同效果的表达式的更简洁的方法是针对零进行测试:
bool isDir = (File.GetAttributes(source) & FileAttributes.Directory) != 0;
它是按位运算符和。
代码段在两个变量之间执行按位AND运算,然后将值与另一个变量进行比较,将结果放入布尔运算。这是按位
和
运算<代码>文件属性是标志枚举。这意味着此枚举的数值中的每个位都描述了此文件的某些布尔属性,并且可以将它们组合起来。它正在执行逐位标志测试-文件。GetAttributes(源)
可以返回指示不同属性的多个标志(以不同的位表示)。&
将1
限制为仅存在于FileAttributes.Directory
中的那些(我希望这是一个位)。碰巧,这是16
,即(二进制).0001000
如果源
具有只读
(=1)、隐藏
(=2)和目录
(=16),则它将是:
...0001011
我们和16个孩子在一起
...0001000
...0001000
离开
...0001000
...0000000
因此,目录测试通过
如果源具有系统(=4)和只读(=1)(而不是目录),则它将是:
...0000101
我们和16个孩子在一起
...0001000
...0001000
离开
...0001000
...0000000
因此,目录测试失败
作为旁注;这种测试中的=
验证是否设置了所有所需的标志(如果第二个操作数中有多个位)。另一个常见的测试是!=0
,它测试是否存在任何位。它正在测试文件属性返回的枚举中是否设置了标记文件属性.Directory
。您可以阅读有关如何在中使用标志枚举的更多信息
我正在尝试评估路径字符串是文件还是目录
我宁愿使用System.IO中的一种方法,如:
GetAttributes返回一个标志值,其中每个位表示不同的布尔状态。除了GetAttributes返回的任何其他标志外,此代码还使用按位&运算符打开目录标志
这似乎过于复杂了。这相当于写:
bool isDir = File.GetAttributes(source).HasFlag(FileAttributes.Directory);
或者,要专门测试目录属性,请执行以下操作:
bool isDir = File.GetAttributes(source) == FileAttributes.Directory;
HasFlag()方法目前有点慢,因此按位替换方法速度更快,使用的资源更少。HASFLAG对于C++中的所需位是开还是关的快速和简单的响应是很好的,一般不知道比特值或二进制值。< / P>我不确定C++如何处理布尔值,但ANSI C也允许稍微短一些:BoO-ISDIR =(文件.GETAsple(源)和文件属性.Directory);