逻辑运算符与(&)、或(|)、非(!)、异或(^)及双与(&&)和双或(||)
&& 与 两个操作数同时为true,结果为true,否则都是false
|| 或 两个操作数有一个为true,结果为true,否则为false
! 非 取反
注意短路效果!
a) 双与和单与
true & true = true
true & false = false
false & false = false
false & true = true
int x = 3;
int y = 4;
//System.out.println((++x == 3) & (++y == 4)); //false & false = false
//System.out.println("x = " + x); //x = 4
//System.out.println("y = " + y); //y = 5
System.out.println("---------------------------");
System.out.println((++x == 3) && (++y == 4)); //false & false = false
System.out.println("x = " + x); //x = 4
System.out.println("y = " + y); //y = 4
b) 位运算符
按位操作符用来操作整数基本数据类型中的单个比特(bit),就是二进制,按位操作符会对两个参数中对应的位(bit)执行布尔运算,最终生成一个结果。按位操作符来源于C语言面向底层的操作,Java设计的初衷是嵌入式电视机机顶盒,所以面向底层的操作也保留了下来。
任何信息在计算机中都是以二进制的形式保存的,”&”、“|”、“^”除了可以作为逻辑运算符也可以作为位运算符。位运算是直接对二进制进行运算。他们对两个操作数中的每一个二进制位都进行运算。例如int是由32个二进制数组成,因此使用位运算符可以对整数值的二进制数进行运算。
位(bit)运算符:
& | 与(AND) |
---|---|
| | 或(OR) |
^ | 异或 |
规则:
可以把1当做true 0当做false
只有参与运算的两位都为1,&运算的结果才为1,否则就为0。
只有参加运算的两位都是0,| 运算的结果才是0,否则都是1。
只有参加运算的两位不同,^运算的结果才为1,否则就为0。
00000110 | 6 |
---|---|
00000011 | 3 |
00000010 | 6 & 3 =2 |
00000110 | 6 |
---|---|
00000011 | 3 |
00000111 | 6|3 =7 |
00000110 | 6 |
---|---|
00000011 | 3 |
00000101 | 6^3 =5 |
//使用异或交换两个变量的值
var num1 = 10;
var num2 = 20;
num1 = num1 ^ num2;
num2 = num1 ^ num2;
num1 = num1 ^ num2;
console.log(num1, num2);
c) 移位操作符
<<左移
>>右移
运算符 | 运算 | 范例 |
---|---|---|
<< | 左移 | 3 << 2 = 12 —> 322=12 |
>> | 右移 | 3 >> 1 = 1 —> 3/2=1 |
// &&逻辑与 ||逻辑或 !取反
// & |
//true && true --->true
//true && false --->false
//false && false --->false
//false && true --->false //如果用的是&&,先看左边的表达式是否是false,如果是false,那么右边的表达式就不看了,因为整个表达式的结果必然是false
//true & true --->true
//true & false --->false
//false & false --->false
//false & true --->false
//true | true --->true
//true | false --->true
//false | false --->false
//false | true --->true
//true || true --->true
//true || false --->true //如果用的是||,此时先看左边表达式的结果是否为true,如果为true,那么右边表达式就不看了,因为整个表达式的结果必然是true
//false || false --->false
//false || true --->true
//为什么我们要用&& 或者 || 呢,原因&&和||多了一个短路的功能
var a = 1;
var b = 2;
// & 取与
/*(a++ > 0) | (b++ > 10);
console.log(a); //2
console.log(b); //3*/
(a++ > 0) || (b++ > 10);
console.log(a); //2
console.log(b); //2
console.log(!a); //false