按位运算符和单个&符号

时间:2012-01-01 03:29:23

标签: java operators bit-manipulation

  

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

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

2 个答案:

答案 0 :(得分:39)

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

一个例子可能是:

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

如果myStringnull,则第一个条件会失败,并且无需检查其值。这是一种可以避免空指针的方法。

  • &¦始终评估两个操作数
  • &&¦¦第二个操作数仅在必要时进行评估

这是一个指向页面的链接,其中有很好的解释如何使用它们。

Java Quick Reference on Operators

答案 1 :(得分:17)

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

首先,双重运算符&&||的功能类似于嵌套的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,例如

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

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