在Java中的运算符(一)中介绍了比较常见的一些运算符,这一节主要围绕一些运算符的用法,以及介绍一些位运算等较复杂难理解的云算符。
首先,上一节的最后,我介绍了一些逻辑运算符,下面附上一些代码,(在注释中会有详细描述)
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程序中运算符的优先级:
运算符的优先级
网友评论