|=(单管道相等)和 &=(单与号相等)是啥意思

Posted

技术标签:

【中文标题】|=(单管道相等)和 &=(单与号相等)是啥意思【英文标题】:What does |= (single pipe equal) and &=(single ampersand equal) mean|=(单管道相等)和 &=(单与号相等)是什么意思 【发布时间】:2011-10-20 00:37:21 【问题描述】:

在下面的行中:

//Folder.Attributes = FileAttributes.Directory | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly;
Folder.Attributes |= FileAttributes.Directory | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly;


Folder.Attributes |= ~FileAttributes.System;
Folder.Attributes &= ~FileAttributes.System;

|=(单管道相等)和&=(单与号相等)在 C# 中是什么意思?

我想删除系统属性并保留其他属性...

【问题讨论】:

【参考方案1】:

他们是compound assignment 操作员,翻译(非常松散)

x |= y;

进入

x = x | y;

& 也是如此。在一些关于隐式转换的情况下有更多细节,并且目标变量只被评估一次,但这基本上是它的要点。

就非复合运算符而言,& is a bitwise "AND" 和 | is a bitwise "OR"。

编辑:在这种情况下,您需要Folder.Attributes &= ~FileAttributes.System。要了解原因:

~FileAttributes.System 表示“所有属性除了 System”(~ 是按位非) & 表示“结果是出现在操作数两侧的所有属性”

所以它基本上充当掩码 - 保留出现在(“除系统之外的所有内容”)中的那些属性。一般来说:

|= 只会向目标添加&= 只会从目标中移除

【讨论】:

x = x | (y); 是更好的描述方式,因为x |= y + z;x = x | y + z; 不同 感谢您的回答/但出于我的目的(删除系统属性)我应该使用哪一个(|= 或 &=)? @LostLord: Folder.Attributes &= ~FileAttributes.System;【参考方案2】: | 是 bitwise or & 是 bitwise and

a |= b 等价于 a = a | b,除了 a 只计算一次a &= b 等价于 a = a & b,除了 a 只计算一次

为了在不更改其他位的情况下删除系统位,请使用

Folder.Attributes &= ~FileAttributes.System;

~ 是按位取反。因此,您会将除系统位之外的所有位设置为 1。 and 使用掩码将其设置为 0 并将所有其他位保持不变,因为 0 & x = 01 & x = x 用于任何 x

【讨论】:

a 只计算一次是什么意思?为什么它会被评估更多次? @silkfire 这称为短路评估,请参阅en.wikipedia.org/wiki/Short-circuit_evaluation @Polluks 所以基本上a |= b实际上意味着a = a || b @silkfire 是的,但不要互换一根管子和两根管子。 @Polluks:我无法理解您关于一根和两根管道的评论——我认为使用两根管道而不是一根是 Silkfire 在last comment 中的全部观点。另外,我不相信“除了 a 只被评估一次”确实是指短路评估,因为短路评估不会改变 first 操作数的评估( a ),但可能会跳过对 second 操作数 (b) 的评估。【参考方案3】:

我想删除系统属性并保留其他属性..

你可以这样做:

Folder.Attributes ^= FileAttributes.System;

【讨论】:

我认为您想为此使用 XOR 而不是 AND。 有点迷茫/~有没有必要 @LostLord 据我所知,这两种方法是相似的 @ChrisS ^= bit 将设置尚未设置的位,&= ~bit 不会设置它。 你肯定不想使用异或。如果它消失了,它就会放回去。

以上是关于|=(单管道相等)和 &=(单与号相等)是啥意思的主要内容,如果未能解决你的问题,请参考以下文章

了解单个与号运算符 (&) 在整数上的行为

JavaScript&jQuery.检测相等和存在

销售领料登记单与装箱单之间接关系

Shell字符串比较相等不相等方法小结

一个简单的客户单与服务端程序

前端笔记六,级联样式单与CSS选择器