运算符(二)
运算符: D-逻辑运算符
E-位运算符
F-三目运算符(三元运算符)
D—a(逻辑运算符):定义:可以连接某个值或某一个表达式
D—b:基本逻辑运算符:&逻辑(单)与(并且的关系)
特点:有false则false
|逻辑(单)或(两个满足一个即可)
特点:有true则true
!逻辑非
特点:非false则true
^逻辑异或
特点:相同则false,不同则true
(同性相斥,异性相吸)
D—c:扩展逻辑运算符:&&逻辑双与
||逻辑双或
共同点:&&和&具有同样的效果,有false则false
||和|具有同样的效果,有true则true
不同:&&具有短路效果,左表达式为false则右边不执行
||也有短路效果,左表达式为true则右边不执行
E—a(位运算符):基本位运算符:& 位与
| 位或
^ 位异或
~ 反码(按位取反)
计算一个数据对另一个数据进行位运算操作,必须算出该数据对应的二进制数据。
E—b:扩展位运算符:
<< 左移动 ----a<<b
当a>0时,a<<b=a*2^b
当a<0时 a<<b=最高位丢掉,在右边补齐0
>> 右移动 ----a>>b
当a>0时,a>>b=a/2^b
当a<0时 a>>b=(最高位是1,坐左补齐1,最高位是0,左补齐0)
>>> 无符号移动 ----a>>>b
当a>0时,a>>>b=a/2^b
当a<o时,a>>>b=(无论最高位是1或0,均左补齐0)
执行程序如下:
/* 符号左边的数为正数时
* << 左移动
* >> 右移动
* >>>无符号移动
*
*/
public static void main(String[] args){
//当符号左边的数为正数时
System.out.println(3<<2);//符号左边乘以2的移动次幂 3*2^2=3*4=12
System.out.println(3>>2);//符号左边除以2的移动次幂 3/2^2=3/4=0(/是取整的)
System.out.println(3>>>2);//符号左边除以2的移动次幂 3/2^2=3/4=0(/是取整的)
System.out.println(4>>>2);//符号左边除以2的移动次幂 4/2^2=4/4=1(/是取整的)
System.out.println(12>>>2);//符号左边除以2的移动次幂 12/2^2=12/4=3(/是取整的)
System.out.println("--------分割线---------");
//当符号左边的数为负数时
/*
* << 左移动,首位丢掉,右补齐0
* >> 右移动,最高位是1,左补齐1;最高位是0,左补齐0;
* >>>无符号移动,无论最高位是1或0,均左补齐0
*
*
*/
System.out.println(-3<<2);
System.out.println(-3>>2);
System.out.println(-3>>>2);
/*
* -3<<2
* -3的二进制: 10000000 00000000 00000000 00000011:原码
* 11111111 11111111 11111111 11111100:反码
* 反码+1=补码
* 11111111 11111111 11111111 11111101:补码
* 补码左移两位
* (11)11111111 11111111 11111111 111101(00)
* 左移后的补码再-1
* 11111111 11111111 11111111 11110011 :反码
* 10000000 00000000 00000000 00001100 :原码
* 结果为: -12
*
* -3>>2
* -3的二进制: 10000000 00000000 00000000 00000011:原码
* 11111111 11111111 11111111 11111100:反码
* 反码+1=补码
* 11111111 11111111 11111111 11111101:补码
* 补码右移两位
* 1111111111 11111111 11111111 111111(01)
* 右移后的补码再-1
* 1111111111 11111111 11111111 111110 :反码
* 1000000000 00000000 00000000 000001 :原码
* 结果为:-1
*
* -3>>>2
* -3的二进制: 10000000 00000000 00000000 00000011:原码
* 11111111 11111111 11111111 11111100:反码
* 反码+1=补码
* 11111111 11111111 11111111 11111101:补码
* 左补齐0:
* 0011111111 11111111 11111111 111111(01)
* 结果是:1073741823
*
*
*
*/
}
F—a(三目运算符):基本运算符:单目运算符,双目运算符。
F—b:三目运算符又叫三元运算符;
格式: (表达式)? 表达式1的结果:表达式2的结果
输出:最终结果是boolean类型。
执行流程:1) 先判断表达式是否成立
2) 成立则为true,将表达式1的结果作为结果输出。
3) 不成立则为false,将表达式2的结果输出。
F—c:练习题:
/*
* 练习:1)求两个数据最大值
* 2)求三个数据最大值
* 3)求两个数据是否相等
*/
public static void main(String[] args){
//定义两个变量,求最大值
int a = 98;
int b = 99;
//定义max变量
int max1 = (a>b) ? a:b;
System.out.println("最大值是:"+max1);
System.out.println("--------下一题-------");
//定义三个变量,求最大值
int x = 34;
int y = 100;
int z = 99;
//定义max变量
int max2 = (x>y) ? x:y;
//定义中间变量,用来存放max2的结果
int Max = (z>max2) ? z:max2;
System.out.println("三个数据的最大值是:"+Max);
System.out.println("--------下一题-----");
//定义两个变量
int m = 44;
int n = 34;
//判断是否相等需要定义boolean类型
boolean flag = (m==n) ? true:false;
System.out.println("判断结果:"+flag);
}