这个C#运算符如何在此代码段中工作?

qua*_*els 5 c# syntax bit-manipulation operators bitwise-operators

我在SO上找到了这个代码片段(抱歉,我没有问题/答案组合的链接)

 bool isDir = (File.GetAttributes(source) & FileAttributes.Directory) == FileAttributes.Directory;
Run Code Online (Sandbox Code Playgroud)

这让我感到困惑,因为FileAttributes.Directory它在两边都有==.

&在这种情况下做什么?我不知道如何阅读这行代码.我正在尝试评估路径字符串是文件还是目录.

Chr*_*ken 5

它做一个按位AND操作.属性存储为位标志,因此它和这些标志一起使用AttributeFlags.Directory来查看其中一个属性是.Directory.

Bit Flags的好例子在这里:http: //weblogs.asp.net/wim/archive/2004/04/07/109095.aspx

[Flags]
public enum FileAttributes
{
  Archive,        // 0000
  Compressed,     // 0001
  Device,         // 0010
  Directory,      // 0100
  Encrypted,       // 1000
  ...
}
Run Code Online (Sandbox Code Playgroud)

然后:

 File.GetAttributes(source):  1101
 FileAttributes.Directory:    0100
 (Logical AND):               0100
Run Code Online (Sandbox Code Playgroud)

0100与目录标志相同,因此我们现在知道该标志位于枚举的所选标志中.


Mar*_*ers 5

它使用位掩码来测试是否设置了单个位(FileAttributes.Directory).

枚举的值是2的幂,对应于各个位.

    ReadOnly = 1,
    Hidden = 2,
    System = 4,
    Directory = 16,
    Archive = 32,
    Device = 64,
Run Code Online (Sandbox Code Playgroud)

如果设置了ReadOnly和Directory,则FileAttributes等于17.计算在二进制文件中如下所示:

File.GetAttributes(source) = 00001001   
FileAttributes.Directory   = 00001000 &
-------------------------------------
                             00001000
Run Code Online (Sandbox Code Playgroud)

如果没有设置目录位,则会得到零:

File.GetAttributes(source) = 00000001   
FileAttributes.Directory   = 00001000 &
-------------------------------------
                             00000000
Run Code Online (Sandbox Code Playgroud)

编写表达式以获得相同效果的稍微简洁的方法是测试零:

bool isDir = (File.GetAttributes(source) & FileAttributes.Directory) != 0;
Run Code Online (Sandbox Code Playgroud)