1.自增自减运算符的前缀后缀区别
前缀自增自减法(++a,- -a): 先进行自增或者自减运算,再进行表达式运算。
后缀自增自减法(a++,a- -): 先进行表达式运算,再进行自增或者自减运算
示例:
public static void main(String[] args){
int a = 5;
int b = 5;
int x = 2*++a;
int y = 2*b++;
System.out.println("自增运算符前缀运算后a="+a+",x="+x);
System.out.println("自增运算符后缀运算后b="+b+",y="+y);
}
}
运行结果为:
自增运算符前缀运算后a=6,x=12
自增运算符后缀运算后b=6,y=10
2.位运算符
Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。
位运算符作用在所有的位上,并且按位运算。
2.1二进制正负转化
比如5的二进制为 0000 0101
对5取反~5得到的为 1111 1010(-6),首位为1表示为负数,对某个二进制数进行取反得到的十进制值并不是该数的十进制负数值而是该数的负数值减一。
注:负数二进制如何计算转换为十进制:减一取反加负号
例如 1111 1010(-6)
①减一:1111 1001
②取反:0000 0110=6
③由于首位为1所以为负数,得到这个二进制的十进制数为-6。
2.2无符号右移>>>与右移运算符>>区别
无符号右移(>>>)规则和带符号右移运算(>>)是一样的,只是填充时不管左边的数字是正是负都用0来填充不用考虑符号位,无符号右移运算只针对负数计算,因为对于正数来说这种运算没有意义 。
2.3左移运算符<<
其规则为:丢弃最高为,0补最低位。因此,左移可以用作乘2操作的一个高效的实现移几位乘几次2,相似右移也可以看做是除以几次2。
比如a=60,a<<2=240,a>>2=15(带符号位)
b=-5,b<<1=-10,b>>1=-3;
-5的二进制就为4(0000 0100)的二进制取反:1111 1011
带符号右移1位1111 1101
二进制负数的十进制数值算法减一取反加负号:
1111 1100 --0000 0011=3,加上负号为-3;
所以-5>>1=-3;
不带符号右移 -5>>>1=64+32+16+8+4+1=121
0111 1101(不考虑符号位直接补零)
3.条件运算符(三目运算符 ()? :)
条件运算符也被称为三元运算符。该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。
示例:
public static void main(String[] args){
int a , b;
a = 10;
// 如果 a 等于 1 成立,则设置 b 为 20,否则为 30
b = (a == 1) ? 20 : 30;
System.out.println( "Value of b is : " + b );
// 如果 a 等于 10 成立,则设置 b 为 20,否则为 30
b = (a == 10) ? 20 : 30;
System.out.println( "Value of b is : " + b );
}
}
运行结果为:
Value of b is : 30
Value of b is : 20
4.instanceof运算符
用来判断该对象是否属于某个类或它的子类,返回一个Boolean值
5.补码、反码、原码
计算机语言为二进制,存在了原码,反码和补码用来处理二进制减法(正数加负数)运算,减法运算其实计算机内部使用一个正数和一个负数的二进制的补码进行的加法运算,否则减法运算得到的十进制数值会不准确。
正数的二进制原码反码补码都是其本身;
负数的二进制原码和反码的相互转换:符号位不变,数值位按位取反;
原码和补码的相互转换:符号位不变,数值位按位取反,末位再加1。
[+1]原=[+1]反=[+1]补=0000 0001
[-1]原=1000 0001
[-1]反=1111 1110
[-1]补=1111 1111
1-1=[+1]补+[-1]补=0000 0000=0