首先,上一节的最后,我介绍了一些逻辑运算符,下面附上一些代码,(在注释中会有详细描述)
public class TestLogic{ public static void main(String[] args){ //逻辑与 & 二元运算符,只要有个参与逻辑与运算的 操作数 为 false 那么整个逻辑表达式的结果就为false。 //有false 就是false,全 true 才 true。 System.out.println(false & true);//false System.out.println(true & false);//false System.out.println(false & false);//false System.out.println(true & true);//true System.out.println("************************************"); //逻辑或 | 有true 则 true ,全false 则false。 System.out.println(false | true);//true System.out.println(true | false);//true System.out.println(false | false);//false System.out.println(true | true);//true //逻辑异或 ^ 相异为true,,相同为 false。 System.out.println("************************************"); System.out.println(false ^ true);//true System.out.println(true ^ false);//true System.out.println(false ^ false);//false System.out.println(true ^ true);//false //逻辑非 ! 一元运算符 对boolean 值取反 true --> false false -- > true int a = 9; System.out.println(!false);//true System.out.println(!true);//false System.out.println(!(++a == a++));//false System.out.println("************************************"); //短路与 && 规律,和使用的结果 和 逻辑与一致。 System.out.println(false && true);//false System.out.println(true && false);//false System.out.println(false && false);//false System.out.println(true && true);//true //区别 在进行逻辑运算的时候,只要前面有一个表达式的值为false,那么短路与将忽略后续的所有参与逻辑与运算的表达式。 a = 10; int b = 15; boolean bool = (a > 15) && (b++ < 20); System.out.println("bool = "+bool);//false System.out.println("b = "+b);//16 //短路或 || 如果前面的表达式的返回值有true,那么后续的表达式将全部被忽略。 //总结:短路与 与 短路或 执行的效率 比 逻辑与 和 逻辑或的效率要高。 } }
如果是混合使用呢?可以执行下以下代码,观察输出结果:
逻辑运算符与自增运算符的逻辑
位运算符:直接对二进制位进行操作的运算符。
位运算的效率比较高。直接对底层的二进制位操作。
java中支持的位运算符:
&:按位与
|:按位或
^:按位异或
~:按位取反
>>:带符号右移
<<:左移
>>>:无符号右移
注意:操作数和结果必须都是整形数。
通过操作数来区分逻辑运算和位运算。
import java.util.Random;public class TestBit{ public static void main(String[] args){ final int MIN = 100; final int MAX = 1000; // & 按位与 规则:对应的位bit上 有0则0 全1 则1 System.out.println(5&6); //将指定的数的二进制后四位所代表的整数求出。 int intNum = (int)(Math.random()*(MAX-MIN)+MIN); System.out.println(Integer.toBinaryString(intNum)); System.out.println(Integer.toBinaryString(intNum&0xf)); // | 按位或 规则: 对应的位bit 上有1 则1 全0 则0 System.out.println(5|6); //特点 :如果两个操作数对应的位上没有全1的情况,那么两个操作数按位或的结果与直接相加的结果一致。 //应用:需要定义8个整数,8个特殊的整数,8个数的所有的排列组合的和的结果都是不同的。 int a1 = 0b00000001; int a2 = 0b00000010; int a3 = 0b00000100; int a4 = 0b00001000; int a5 = 0b00010000; int a6 = 0b00100000; int a7 = 0b01000000; int a8 = 0b10000000; //按位异或 ^ 规则:相异为1 相同为0 System.out.println(5^10);//15 //特点:一个操作数,连续异或同一个数2次,结果是该数自身。 System.out.println((char)('你'^10));//15 //简单的加密的功能 char c1 = '我'; char c2 = '恨'; char c3 = '你'; //密钥 int key = 20; System.out.println(""+(char)(c1^key) + (char)(c2^key)+(char)(c3^key));// System.out.println(""+(char)(c1^key^key) + (char)(c2^key^key)+(char)(c3^key^key));// //按位取反 ~ 单目 规则:1-->0 0--->1 包括符号位。 System.out.println(~0); System.out.println(~127);//0111 1111-》 1000 0000 //左移 << 规则:直接移走高位指定的位数 低位补0。 int a = 10;// 1010--> 101000-->40 //1010--> 10100-->20 a <<= 1; System.out.println(a); 2的16次幂可以表示为1<<16; //应用:可以在一定范围内,替代 乘以2的次幂。 a <<= 27; System.out.println(a); //带符号右移 >> 规则:低位被挤走,高位补符号位 正数补0 负数 补1 //应用:在一定范围内,可以实现除以二的n次幂。移动几位,除以二的几次幂。 a = 9;// 1001 >> 2 ---> 10 a = -1; a >>= 10; System.out.println(a); //无符号右移 >>> 规则: 低位被挤走,高位补0 a = -1; System.out.println(a>>>=1); //应用:为了得到一个正整数 //另外一种得到随机数的方式 Random random = new Random(); //random.nextInt() 结果为随机的在int 取值范围内的一个值 //int ran = random.nextInt() >>> 1; //System.out.println(" ran= "+ran); //[100~1000) //ran%(MAX-MIN);[0~900) //ran%(MAX-MIN)+MIN;[100~1000) int ran = (random.nextInt() >>> 1)%(MAX-MIN)+MIN; System.out.println(" ran= "+ran); //需求:将随机数的5-8位所代表的整数求出 System.out.println(Integer.toBinaryString(ran)); System.out.println(Integer.toBinaryString((ran&0xf0)>>4)); } }
条件运算符
唯一的一个三目运算符
语法:
[第一部分] ? [第二部分] : [第三部分]
第一部分:必须返回一个boolean 值。
如果第一部分 结果为true ,那么执行 第二部分。
如果第一部分 结果为 false ,那么跳过第二部分,执行第三部分。
注意:第二部分,和第三部分,返回的值的类型必须兼容。
运行代码:
System.out.println(a>b?1:9.0);//运行结果如果正确会转化成浮点数与9.0保持一致,(顺便复习以下类型转换)
运算符的优先级
好比数学中的运算符优先级:有乘除先算乘除,有小括号先算小括号里面的
下面附上Java程序中运算符的优先级:
作者:Tinner丶
链接:https://www.jianshu.com/p/6a9f9dd67110