运算符 用来指明对于操作数的运算方式
按照操作数的数目来进行分类:
单目 a++
双目 a+b
三目 (a>b)?x:y a>b成立,执行x;a>b不成立,执行y;
按照运算符的功能来进行分类:
算术运算:+ - * / %(取余、取模) ++ --(自减);int x = 5;x/2-->2;x%2-->1
赋值运算:= (赋值符号 将=右边的内容(值 引用)存入=左边的变量空间内)
+= -= *= /= %= (复合型);
int x = 1;
x++;//x自增了一个,如何让x增加10个?
int x = 1;for(int i=1;i<=10;i++){x++;} 或 x += 10;x = x+10;
关系运算(比较);> >= < <= != == instanceof(判断对象类型)
1.=和==的区别;
=赋值符号,将=后面的内容(值,引用)存入=左边的变量空间内;
==比较符号 前后内容是否一致;
2.比较运算符的最终结果是什么?
3>2 boolean true false
3.作用:一个条件的判定;
逻辑运算;&(逻辑与,和、并且); |(逻辑或,或者)
^(逻辑异或,前后不一致则为true); !(逻辑非,一个条件,将原来结果取反)
&& (短路与); ||(短路或)
1.逻辑运算前后连接的两个boolean结果;
2.&&短路与什么情况下才会发生?第一个条件为false时,会发生短路
3.&&短路的是什么?短路的是&&之后所有计算的过程;
4.如果发生了短路情况,性能比&稍微好一点;
5.&和&&的区别?
&可以视为逻辑运算,可以视为位运算;&&只能当做逻辑运算来用;
&与&&都当做逻辑运算符来使用的时间区别如下;
执行的最终结果没有区别;
第一个条件为false时,&&的性能好一点;
6.|| 如果当第一个条件为true时,则后面的条件不执行;
位(bit)运算;
&按位与; |按位或; ^按位异或;
~按位取反; <<按位左位移; >>按位右位移;>>>按位右位移(无符号)
3&5=?
1.将3和5转化成二进制表示形式;011,101
2.竖着按照对应位置进行& | ^计算;(1表示true,0表示false)
3.将计算后的二进制结果转化为十进制;3&5计算后的001,转化为十进制为1;
3|5 二进制111 十进制7;3^5 二进制110 十进制6;
6<<1 =? 12;
6<<2 =? 24;
6>>1 ==? 3
左位移 相当于乘以2的位移次幂;
右位移 相当于除以2的位移次幂;
===================================================================
原码 反码 补码 二进制表示数字;
如,6,正数的原码=反码=补码;
原码: 00000000 00000000 00000000 00000110
如,-6,
原码:10000000 00000000 00000000 00000110
反码:11111111 11111111 11111111 11111001(符号不动,其它取反)
补码:11111111 11111111 11111111 11111010(反码+1)
计算机中不管是正数还是负数,存储的形式都是以补码形式存储;
反码是一种表示形式,取反是一个计算过程(每一个位置都取反);
进制转化问题?
十进制 0 1 2 3 4 5 6 7 8 9
十进制-->二进制;60除以2取余数,将余数倒序排列,即为有效位;
00000000 00000000 00000000 00111100;
二进制-->十进制;从右至左开始计算 每一个元素乘以2的位置(0开始)次幂;
111100;0*2的0次幂+1*2的2次幂+1*2的3次幂...=4+8+16+32=60
8进制 01234567
将三个二进制合并为一个;计算成十进制表示、八进制表示形式以0开头;
16进制 0123456789ABCDEF
将四个bit记录为一个小组,16进制表示形式以0X开头;
====================================================================
int x = 1;
int y = x++;先赋值 后自增(这样理解是错的) 算术运算符优先级高于赋值运算(先计算,后赋值);
x++ 等价于 x=x+1,将x变量空间的内容先取出 常量区取出1 进行计算 ,再次存回x空间
x在想要做值交换(计算)的时候,会产生一个临时的副本空间(备份)
++在变量的前面(++x),先自增后备份; ++在变量的后面(x++),先备份后自增;
会将副本空间内的值赋给别人;
int a=1;a=a++;a的结果为1;先备份,后自增,再赋值备份的值;
x变量空间的值取出,从常量区取过来2 加法运算 结果重新存回x变量空间内;
x空间 8bit
常量区 32bit
+自动类型提升 8bit ——>32bit;
强制类型转换后,无问题了;
2.最有效地方法计算2*8的结果;
00000010 00001000;
2<<3相当于2乘以2的3次幂;
乘数刚好是2的次幂;可以采用位移运算;
2*5 5<<1
3.两个变量int a=1;int b=2;如何将两个变量的值进行交换;
方式一、采用一个中间变量空间;好处是容易理解;坏处是产生一个新的内存空间;
方式二、采用赋值;好处是不产生新的空间;坏处是不易理解;坏处是可能会在+产生值越界;
a=a+b;//a空间存储的两个元素之和3;b仍是2;
b=a-b;//a+b-b剩下的是原来的a;此时b是1;a仍是3;
a=a-b;//a+b-a剩下的是原来的b;此时a是2;b仍然是1;
方式三、
a=a^b;//1^2 ==>00000001^00000010==>00000011==3
b=a^b;// a^b^b;3^2==>011^010==>001==1
a=a^b;//a^b^a;
用一个数字异或(^)同一个数字两次,值不会改变;