Sum*_*hra 104 java boolean-logic bitwise-operators logical-operators
我知道规则&&
,||
但是什么是&
和|
?请以一个例子向我解释这些.
Jus*_*ner 125
这些是按位AND和按位OR运算符.
int a = 6; // 110
int b = 4; // 100
// Bitwise AND
int c = a & b;
// 110
// & 100
// -----
// 100
// Bitwise OR
int d = a | b;
// 110
// | 100
// -----
// 110
System.out.println(c); // 4
System.out.println(d); // 6
Run Code Online (Sandbox Code Playgroud)
感谢卡洛斯指出在Java语言规范中相应的部分(15.22.1,15.22.2关于基于其输入操作者的不同的行为).
实际上,当两个输入都是布尔值时,运算符被认为是布尔逻辑运算符,其行为类似于Conditional-And(&&
和)和Conditional-Or(||
)运算符,除非它们不会短路,因此以下是安全的:
if((a != null) && (a.something == 3)){
}
Run Code Online (Sandbox Code Playgroud)
这不是:
if((a != null) & (a.something == 3)){
}
Run Code Online (Sandbox Code Playgroud)
Tor*_*res 104
我想你在谈论两个运营商的逻辑意义,在这里你有一个表简历:
boolean a, b;
Operation Meaning Note
--------- ------- ----
a && b logical AND short-circuiting
a || b logical OR short-circuiting
a & b boolean logical AND not short-circuiting
a | b boolean logical OR not short-circuiting
a ^ b boolean logical exclusive OR
!a logical NOT
short-circuiting (x != 0) && (1/x > 1) SAFE
not short-circuiting (x != 0) & (1/x > 1) NOT SAFE
Run Code Online (Sandbox Code Playgroud)
Lyn*_*rer 25
我知道这里有很多答案,但它们看起来有点令人困惑.因此,在从Java oracle学习指南做一些研究之后,我想出了三种不同的场景,即何时使用&&或&.这三种情况是逻辑AND,按位AND和布尔AND.
逻辑AND:
逻辑AND(又名条件AND)使用&&运算符.它是短路的意思:如果左操作数为假,则不会评估右操作数.
例:
int x = 0;
if (false && (1 == ++x) {
System.out.println("Inside of if");
}
System.out.println(x); // "0"
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,打印到x控制台的值将为0,因为if语句中的第一个操作数是false,因此java不需要计算(1 == ++ x)因此不会计算x.
按位AND: 按位AND使用&运算符.它用于对值进行按位运算.通过查看二进制数字运算,可以更容易地看到正在发生的事情:
int a = 5; // 5 in binary is 0101
int b = 12; // 12 in binary is 1100
int c = a & b; // bitwise & preformed on a and b is 0100 which is 4
Run Code Online (Sandbox Code Playgroud)
正如您在示例中所看到的,当数字5和12的二进制表示排成一行时,按位AND预先形成将只生成二进制数,其中两个数字中的相同数字具有1.因此0101和1100 == 0100.十进制数为5和12 == 4.
布尔AND: 现在,布尔AND运算符的行为与按位AND和逻辑AND的行为相似且不同.我喜欢把它想象为在两个布尔值(或位)之间执行按位AND,因此它使用&运算符.布尔值也可以是逻辑表达式的结果.
它返回true或false值,非常类似于逻辑AND,但与逻辑AND不同,它不会短路.原因是,它要按预先形成按位AND,它必须知道左右操作数的值.这是一个例子:
int x = 0;
if (false & (1 == ++x) {
System.out.println("Inside of if");
}
System.out.println(x); //"1"
Run Code Online (Sandbox Code Playgroud)
现在,当运行if语句时,即使左操作数为false,也将执行表达式(1 == ++ x).因此,为x打印的值将为1,因为它增加了.
这也适用于逻辑OR(||),按位OR(|)和布尔OR(|)希望这可以解决一些混乱.