|=(单管道相等)和 &=(单与号相等)是啥意思
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 = 0
和 1 & 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
不会设置它。
你肯定不想使用异或。如果它消失了,它就会放回去。以上是关于|=(单管道相等)和 &=(单与号相等)是啥意思的主要内容,如果未能解决你的问题,请参考以下文章