++ 和 - -
++和- -是面试笔试的一个常考话题,首先可以分为两类,一类是a++(a- -),另一类是++a(- -a).
不管++还是- -都是针对于使用它的变量而言,也就是变量的自加或者自减操作,但两种方式在内存中的运行过程却大不相同,分别画图举例。
- 当++(- -)在后面时
int a = 1;//先定义一个变量a并且赋值
int b = a++;//在给b变量赋值
- 当++(- -)在前面时
int a = 1;
int b = ++a;
扩展:
int a = 1;
a = a++;//这个a等于多少?
a = ++a;//这个a等于多少?
算数运算符
“+”、“-”、“*”、“/”、“%”(取余)
赋值运算符
- = :用于赋值操作
- += :相当于本身先加后面的再赋值到本身。例如:a+=1;–>a = a + 1;
- -= :相当于本身先减再赋值。
- /= :相当于本身先除再赋值。
- *= :相当于本身先乘再赋值。
- %=:相当于本身先取余再赋值。
注意:
1.小数据类型进行赋值运算时可能出现编译错误
byte x = 1;
x += 2;//结果为3,虽然是与32bit的“2”进行运算,但是“=”能够将数据进行自动类型转化。
x = x + 1;
/*编译报错,
报错原因是“1”为int类型数据,在进行x + 1操作的时候,比较运算符“+”自动把8bit的x转化成32bit的int类型与32bit的“1”进行加法运算,运算完成后的结果在赋值到8bit的x空间里面。
虽然对于数据来说,“=”能够进行数据转化,但是对于算式来说这种转化就失效了*/
比较运算符
- “==”:前后数据相等返回true,否则返回false。
- “>”:大于号
- “<”:小于号
- “!=”:前后不等于返回true,否则返回false。
- “>=”:大于等于
- “<=”:小于等于
逻辑运算符
- &:并且,所有条件都满足返回true,否则返回false
- |:或者,只要有条件满足就返回true,都不满足返回false
- !:非,如果本来是true加上!之后改为false,如果本来是false,加上之后改为true
- ^:异,相同为false,不同为true
- &&:短路与,当前一个条件不满足就不会执行后一个条件,比单个&效率高
- ||:短路或,当前一个条件满足就不会在执行后一个条件,比单个|效率高
位运算符
- & 按位与
int a = 3 & 5;
步骤:
1.先转化为二进制数表示形式
2.竖着按照按照对应位置进行&计算(1代表true,0代表false)
3.将计算后的二进制数转化为十进制数
00000011 -->3
00000101 -->5
00000001 -->结果为1
- | 按位或
int a = 3 | 5;
步骤:
1.先转化为二进制数表示形式
2.竖着按照按照对应位置进行 | 计算(1代表true,0代表false)
3.将计算后的二进制数转化为十进制数
00000011 -->3
00000101 -->5
00000111 -->结果为7
- ^ 按位异或
int a = 3 ^ 5;
步骤:
1.先转化为二进制数表示形式
2.竖着按照按照对应位置进行 ^ 计算(1代表true,0代表false)
3.将计算后的二进制数转化为十进制数
00000011 -->3
00000101 -->5
00000110 -->结果为6
- ~ 按位取反
补充知识:
对于十进制数“6”和“-6”有以下三种二进制数表示形式.原码:
00000000 00000000 00000000 00000110 ->6
10000000 00000000 00000000 00000110 ->-6
反码:
00000000 00000000 00000000 00000110 ->6
11111111 11111111 11111111 11111001 ->-6是原码的二进制数符号保持不变,其余位按位取反
补码:
00000000 00000000 00000000 00000110 ->6
11111111 11111111 11111111 11111010 ->-6是反码+1
计算机中不管是存储正数还是负数,存储的形式都是以补码的形式存储
注意:反码是一种数据的表现形式,取反是一个计算过程(每个位置都取反)
int a = ~3;
步骤:
00000011 -->3
11111100 -->结果为124
- << 按位左位移
int a = 6 << 2;
步骤:
注意这里的二进制是补码类型
00000000 00000000 00000000 00000110 -->6
乘以2的位移次幂
00000000 00000000 00000000 00011000 -->结果为24
- “>>” 按位右位移
int a = 6 >> 2;
步骤:
注意这里的二进制是补码类型
00000000 00000000 00000000 00000110 -->6
除以2的位移次幂(保留符号位,如果是负数就填1,正数就填0)
00000000 00000000 00000000 00000001 -->结果为1,
- ">>> " 按位右位移(无符号)
int a = -6 >>> 2;
步骤:
注意这里的二进制是补码类型
11111111 11111111 11111111 11111010 --> -6
乘以2的位移次幂(不保留符号位,移动过程一律填0)
0011111111 11111111 11111111 111110 -->结果为1073741822
三目运算符(也叫三元运算符)
格式为:
条件表达式?表达式1:表达式2
当条件表达式为true则执行表达式1,如果为false则执行表达式2.
举例:
/**在这个方法里面,先比较参数a>b,然后将谁比较大这个字符串放到result,最后输出*/
public void test(int a,int b){
String result = a>b?a+"比较大":b+"比较大";
System.out.println(result);
}