按位运算符和单与号 [重复]

Posted

技术标签:

【中文标题】按位运算符和单与号 [重复]【英文标题】:Bitwise operator and single ampersand [duplicate] 【发布时间】:2012-01-31 06:40:42 【问题描述】:

可能重复:Why do we usually use || not |, what is the difference?

我可以使用像& 这样的单& 号而不是像&& 这样的按位运算符吗?可能会出现什么样的差异,有没有具体的例子可以清楚地说明这个问题?

【问题讨论】:

这听起来有点像吹毛求疵,但另一个问题是询问a/a/主导编码变体的原因,而这个问题有点“宽泛”;如果将 Hot Licks 的答案(第二个)作为“为什么我们通常使用 || 而不是 |,有什么区别?”这个问题的答案,将(更多)不合适。虽然它在这里提供了(在我看来)有价值的额外见解 【参考方案1】:

单个& 将始终检查这两个条件。如果计算结果为 false,则双 && 将在第一个条件之后停止。使用两个是一种“短路”条件检查的方法,如果您真的只需要 2 的 1 个条件为真或假。

一个例子可以是:

if (myString != null && myString.equals("testing"))

如果myStringnull,第一个条件将失败,它不会费心检查它的值。这是避免空指针的一种方法。

&¦ 始终计算两个操作数 &&¦¦ 仅在必要时才计算第二个操作数

这是一个页面链接,其中很好地解释了如何使用这些。

Java Quick Reference on Operators

【讨论】:

绝对正确。使用“&”、“|”和朋友,如果你想旋转位(例如位图标志)。使用“&&”或“||”如果你想评估“如果这个,那么那个”的条件。使用后者的一个重要考虑因素是“短路评估”,这意味着评估将在遇到明确的“真”或“假”时停止。 链接现在指向垃圾邮件 我现在更新了链接以使用另一个站点。感谢您指出这一点。【参考方案2】:

其他答案在一定程度上是正确的,但不要解释整个事情。

首先,双重运算符&&||,函数有点像嵌套的if 语句:

if (expression_a && expression_b) 
    do_something;

等价于

if (expression_a) 
    if (expression_b) 
        do_something;
    

在这两种情况下,如果expression_a 的计算结果为false,那么expression_b 将不会被计算——这一特性被称为“短路”。 (|| 的情况类似,但要复杂一些。)

此外,在 Java(但不是 C/C++)中,&&|| 运算符应用于布尔值 - 您不能在int,例如。

另一方面,单运算符&| 是相对“纯”的运算符(相对于它们自身可交换和关联),没有双运算符的“短路”。此外,它们可以对任何整数类型进行操作——boolean、char、byte、short、int、long。它们执行逐位运算——左操作数的位 N 与右操作数的位 N 进行 AND 或 OR 运算,以产生与两个操作数的位宽相同的结果值中的第 N 位(在它们之后为二元运算符适当加宽)。在这方面,他们对boolean 的操作只是退化的情况(尽管有点特殊)。

通常,在if 语句中组合布尔表达式时,只会使用加倍运算符。如果所涉及的布尔表达式是“安全的”(例如,不会导致空指针异常),则使用单个运算符并没有太大的危害,但是双运算符往往效率更高,并且通常需要短路(就像在if (a != null && a.b == 5) 中一样,例如),所以培养使用双重形式的习惯通常是明智的。唯一需要注意的是,如果您想要对第二个表达式进行求值(因为它的副作用),doubled 运算符不能保证会发生这种情况。

【讨论】:

很好地解释了为什么单运算符形式适用于布尔表达式,帮助我理解。

以上是关于按位运算符和单与号 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

带与号的三元运算符[重复]

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

c语言的按位运算符怎么操作!?

C语言中位移位运算符?

位运算符详解

位运算