Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个C#运算符在这个代码段中是如何工作的?_C#_Syntax_Operators_Bit Manipulation_Bitwise Operators - Fatal编程技术网

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

这个C#运算符在这个代码段中是如何工作的?,c#,syntax,operators,bit-manipulation,bitwise-operators,C#,Syntax,Operators,Bit Manipulation,Bitwise Operators,我在SO上找到了这个代码段(很抱歉,我没有到问答组合的链接) 这让我很困惑,因为FileAttributes.Directory位于=的两侧 在这种情况下,&做什么?我不知道怎么读这行代码。我正在尝试评估路径字符串是文件还是目录。单个&是位运算符。 它对两个值的各个位执行按位AND。它在位掩码中被大量使用。它执行位AND操作。属性存储为位标志,因此它将这些标志与AttributeFlags.Directory一起进行and'运算,以查看其中一个属性是否为.Directory 这里是位标志的好例

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

这让我很困惑,因为
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);