java运算符
java运算符
比较运算符
== :基本类型比较的是数值,引用类型比较的是地址值
!= : 不等比较
三元运算符
表达式?结果1:结果2 三目运算符
int a=10;
int b=5;
int c= a>b?1:2;//c的结果为1。该运算符的含义为 表达式为真则取结果1,为假则取结果2
逻辑运算符
&:与
表达式1&表达式2 表达式1与表达式2都为真则结果为真
&&:短路与
表达式1&&表达式2 含义与上相同,区别为,若表达1为假,则无需判断表达式2,结果直接为假
|:或
表达式1|表达式2 表达式1和表达式2中有一个为真则为真
||:短路或
表达式1||表达式2 含义与上相同,区别为,若表达式1为真,则无需判断表达式2,结果直接为真
!:非
!表达式 表达式为真则结果为假,表达式为假则结果为真
赋值运算符
= :赋值
int a=1;
+=,-=,*=,/= : 复合的赋值运算
int a=1;
int a+=1;//相当于 int a=a+1;
int a-=1;//相当于 int a=a-1;
int a*=1;//相当于 int a=a*1;
int a/=1;//相当于 int a=a/1;
注意:
byte a=1;
a=a+1 与 a+=1;是有区别的
/*
a=a+1 的写法会报错,因为a+1为int类型,a为byte类型,需要强转一下 a=(byte)(a+1)
a+=1; 的写法不会报错,这里会默认强制转换
*/
位移运算符
左移运算符(<<)
概念:按照数字的补码运算,左移两位,低位补0,包括符号位
public static void main(String[] args) {
int a=8;
int b=a<<2;
//8的补码为: 00000000 00000000 00000000 00001000
//位移的结果为:00000000 00000000 00000000 00100000
//换成原码为: 00000000 00000000 00000000 00100000
//结果为: 32
System.out.println(b);
int c=-9;
int d=c<<28;
//-9的补码为: 11111111 11111111 11111111 11110111
//位移的结果为: 01110000 00000000 00000000 00000000
//换成原码为: 01110000 00000000 00000000 00000000
//结果为:1879048192
System.out.println(d);
}
/*
结果为:
32
1879048192
*/
右移运算符(>>)
概念:按照数字的补码运算,丢弃右边位置,左边符号位不变,其余位置补符号位的值
public static void main(String[] args) {
int a=8;
int b=a>>2;
//8的补码为: 00000000 00000000 00000000 00001000
//位移的结果为:00000000 00000000 00000000 00000010
//换成原码为: 00000000 00000000 00000000 00000010
//结果为: 2
System.out.println(b);
int c=-9;
int d=c>>2;
//-9的补码为: 11111111 11111111 11111111 11110111
//位移的结果为: 11111111 11111111 11111111 11111101
//换成原码为: 10000000 00000000 00000000 00000011
//结果为:-3
System.out.println(d);
}
/*
结果为:
2
-3
*/
无符号右移运算符(>>>)
概念:按照数字的补码运算,丢弃右边符号位置,左边包括符号位都补0
public static void main(String[] args) {
int a=8;
int b=a>>>2;
//8的补码为: 00000000 00000000 00000000 00001000
//位移的结果为:00000000 00000000 00000000 00000010
//换成原码为: 00000000 00000000 00000000 00000010
//结果为: 2
System.out.println(b);
int c=-9;
int d=c>>>2;
//-9的补码为: 11111111 11111111 11111111 11110111
//位移的结果为: 00111111 11111111 11111111 11111101
//换成原码为: 00111111 11111111 11111111 11111101
//结果为:1073741821
System.out.println(d);
}
/*
结果为:
2
1073741821
*/
算术运算符
+,-,*
%: 取余
int a=100%3 //结果为1
/:取整
int a=11/2; //结果为5
++:自增
int a=1;
int c=++a;//c的结果为2,自增常用于循环中
--:自减
int a=2;
int b=--a; //c的结果为1,自减也常用于循环中
&:按位与
概念:两个数字的补码一 一相对,同为0则为0,0和1则为0,同为1则为1
int a=9;
int b=-9;
int c=4;
int d=8;
int e=a&c;
//结果为0步骤如下
//a为9 其补码为 00000000 00000000 00000000 00001001
//c为4 其补码为 00000000 00000000 00000000 00000100
//按上述计算结果为 00000000 00000000 00000000 00000000
int e=a&d;
//结果为8步骤如下
//a为9 其补码为 00000000 00000000 00000000 00001001
//d为8 其补码为 00000000 00000000 00000000 00001000
//按上述计算结果为 00000000 00000000 00000000 00001000
int f=b&d;
//结果为0步骤如下
//b为-9 其补码为 11111111 11111111 11111111 11110111
//d为8 其补码为 00000000 00000000 00000000 00001000
//按上述计算结果为 00000000 00000000 00000000 00000000
//计算的结果为补码,需要转换为原码再计算值,因为是正数补码与原码相同
|: 按位或
概念:两个数字的补码一 一相对,同为0则为0,0和1则为1,同为1则为1
int a=9;
int b=-9;
int c=4;
int d=8;
int e=a|c;
//结果为13步骤如下
//a为9 其补码为 00000000 00000000 00000000 00001001
//c为4 其补码为 00000000 00000000 00000000 00000100
//按上述计算结果为 00000000 00000000 00000000 00001101
int e=a|d;
//结果为9步骤如下
//a为9 其补码为 00000000 00000000 00000000 00001001
//d为8 其补码为 00000000 00000000 00000000 00001000
//按上述计算结果为 00000000 00000000 00000000 00001001
int f=b|d;
//结果为-1步骤如下
//b为-9 其补码为 11111111 11111111 11111111 11110111
//d为8 其补码为 00000000 00000000 00000000 00001000
//按上述计算结果为 11111111 11111111 11111111 11111111
//该负数对应的原码为 10000000 00000000 00000000 00000001 所以结果为-1
^ : 异或
概念:两个数字的补码一 一相对,同为0则为0,0和1则为1,同为1则为0,注意与或的区别
int a=9;
int b=-9;
int c=4;
int d=8;
int e=a^c;
//结果为13步骤如下
//a为9 其补码为 00000000 00000000 00000000 00001001
//c为4 其补码为 00000000 00000000 00000000 00000100
//按上述计算结果为 00000000 00000000 00000000 00001101
int e=a^d;
//结果为1步骤如下
//a为9 其补码为 00000000 00000000 00000000 00001001
//d为8 其补码为 00000000 00000000 00000000 00001000
//按上述计算结果为 00000000 00000000 00000000 00000001
int f=b^d;
//结果为-1步骤如下
//b为-9 其补码为 11111111 11111111 11111111 11110111
//d为8 其补码为 00000000 00000000 00000000 00001000
//按上述计算结果为 11111111 11111111 11111111 11111111
//该负数对应的原码为 10000000 00000000 00000000 00000001 所以结果为-1
~ : 取反
概念:两个数字的补码一 一相对,按位取反,0则取为1,1则取为0
int a=~9;
//结果为13步骤如下
//a为9 其补码为 00000000 00000000 00000000 00001001
//按上述计算结果为 11111111 11111111 11111111 11110110
//该负数对应的原码为 10000000 00000000 00000000 00001010 所以结果为-10