算术运算符:+ - * / (加减乘除)
大部分和生活里面的运算是一样的,有个特殊情况需要注意。
例如:*/
int x = 6570;
x = x/1000*1000;
/*
上面运算中,如果按照生活中的运算结果应该还是6570.
但在JAVA虚拟机中的运算结果是6000.
因为6570除以1000的结果是6.57,JAVA是强类型语言,x为int类型,在这一步的时候,底层自动将
6.57转为整数,也就是6. 6乘以1000得到的结果是6000.
这是JAVA的特点,需要注意。
% 取余,模运算 两数相除,如果有余数就只取余数,如果没有则是0.
例如:
*/
int a=5%3;
/*
这里,5除以3等于1,余数为2.模运算就是取余数,所以得到的结果是2.
没有余数时得到的结果就是0.
如果左边的数小于右边的数,无法运算,结果直接就是左边的数。
比如 2%5 无法运算,结果就直接是2.
+号同时也是连接符,用于输出时与字符串连接。
++ 自增1 -- 自减1
赋值运算符:= += -= *= /= %= (赋值 加等 减等 乘等 除等 模等 )
= 就是赋值 右边的值赋给左边 x = 3 意思就是把右边的3赋给左边的x
+= 加等 将左右两边的和赋给左边。
例如:*/
int b =5;
b+=2;//b= b+2 可以这样理解(运算过程不是如此) 就是将b原来的值5加2 再赋给左边的b 所以结果是7.
//同理,减等就是将两边的差赋给左边。
int c=8;
c-=3;//结果是5.
//乘等和除等的原理同上。
//赋值运算符的特点就是遇到不一样的数据类型时,它会在底层自动进行数据类型转换。例如:
short d =5;
//d=d+2; 这里是会报错的,因为2默认是int类型。
//应该写为
d=(short)(d+2);
//这一步就是强制类型转换。
/*
比较运算符:> 大于 < 小于 >= 大于等于 <=小于等于 == 等等于 != 不等于
比较运算符是判断表达式的结构符号,结果只能是true和false
逻辑运算符:用于连接两个Boolean类型的判断表达式。
&:与符号。 */
int e=7;
//System.out.println(2<e&10>e);
/*
Boolean表达式的结果只能是true或false &与符号用于连接两边表达式的正确性再进行判断
上面我们定义的e为7 2<7 同时 10>7 两边表达式的结果都为true 所以它的结果也是true。
&与符号的运算特点:
true & true = true;
true & false = false;
false & true = false;
false & false = false;
说明在&与运算中,只有两边表达式为true 结果才能为true,否则都为false。
|:或运算符的特点:
true | true = true;
false | true = true;
true | false = true;
false | false = false;
说明在|或运算符中,只有两边都为false时结果才为false,其余都是true。
^异或运算符特点:
true ^ true = false;
false ^ true = true;
true ^ false = true;
false ^ false = false;
和|的唯一区别是两边为true时,结果为false。其余和|或运算符的结果全部一样。
意思说两边结果相同时为false,不同时为true。
! 非运算符,判断事物的另一面。
!true = false; 非真就是假
!false = true; 非假就是真
&& 双与
和&与的运算结果一样,只是过程有区别。
&是无论左边的运算结果是什么,右边都参与运算。
&&是只要左边为false,右边不参与运算,即短路。
|| 双或
和|的运算结果一样,过程有区别。
|是无论左边的运算结果是什么,右边都参与运算。
||是只要左边为true,右边不参与运算,即短路。
&和&&的区别 |和||的区别很可能是面试题,一定要重点掌握。
位运算符:用于二进制位运算的符号。
&运算符 &不仅是逻辑运算符,同时也是位运算符。
比如 6&3 它的结果应该是这么来的
位运算是二进制运算,所以得把两个数转换成二进制数再进行运算
为了方便,这里不再将两个数的32位全部写出来,只保留有效位即可。
6的二进制数为 0110 3的二进制数为 0011
在二进制中 0就是false 1就是true 所以
0110
&0011
0010 二进制转换过来是2 它的结果就是2
&运算的判断结果参考&作为逻辑运算符是的判断方法。两个为true才为true,也就是1.
|运算符:和&一样,同是逻辑运算符,也是位运算符
比如 6|3 算法与上面同理,判断结果也是根据|作为逻辑运算符时的结果。
0110
|0011
0111 转换过后是7 所以结果是7
^异或运算符
6^3 ^异或的特点就是两边相同为false,不同为true。
0110
^0011
0101 转换过来是5
^异或有个特点:
一个数被同一个数异或两次后得到的还是原数。这个特点可以用于数据加密。
总结:&与运算 |或运算 ^异或运算 这三种运算方法,有一个共同的特点。
那就是相运算的两个数位置即使互换,结果还是一样。
~反码,数值取反。
整数的负数二进制表现形式为取反再加1
这里就只是取反 未加1 所以一个整数取反的数就是他的负数再减1.
~8 的反码是 -9 ~7的反码是-8 就是这样
反码不常用,几乎不用。
<< 左移运算符
3<<2
首先还是转换为二进制,这里涉及到移位,为方便理解,把全部字节都写出来
0000-0000 0000-0000 0000-0000 0000-0011
左移两位就是将整个数值的字节往左移动两个数值并舍弃 后面空出来的两个数值位用0弥补。
得到的结果就是:
0000-0000 0000-0000 0000-0000 0000-1100
也就是12
由此我们可以看出 一个数左移一位得到的数就会是原数的2倍,也就是乘以2.再移动一位就再乘以2.
一个数左移几位其实就是该数乘以2的几次方。
>>右移运算符。和左移差不多。
需要注意的是,右移时,原数最高为是0就拿0补位,是1就用1补位。
同样我们可以看出特点 右移几位其实就是该数除以2的几次方、
例如:8>>2 得到的结果2.
>>>无符号右移 和右移原理是完全相同的
区别在于 无符号右移时,不管原数最高位是什么,都拿0去补位。
练习,将两个变量的值进行互换。
通常情况下,我们应该建立一个临时的第三方变量来进行存储,然后再互换前两个变量。
*/
int f=3,g=6;
/*int h;
h=f;//这里h等于3
f=g;//这里f等于6
g=h;//这里g等于3
//再提一个要求,再不允许使用第三方变量的情况下,我们应该怎么互换?
//我们可以用两者的和来进行运算。
f=f+g;//这里f=3+6
g=f-g;//g=3+6-6;g=3;
f=f-g;//f=3+6-3;f=6;
不过这种方式不建议用,因为如果两数过大,超出数据类型范围的话,容易强制转换,数据丢失。
我们知道一个数异或同一个数两次还能得到原数,所以这里我们可以用异或来解决问题。
*/
f=f^g;//这里f的值开始变化。
g=f^g;//3^6^6=3;g=3;
f=f^g;//3^6^3=6;f=6;
/*不过这种方式阅读性很差,一般面试才会用。
开发时一般还是用第三方变量方式比较多,阅读性强,好理解。
三元运算符: (条件表达式)?表达式1:表达式2;
如果条件表达式结果为true,则运算表达式1;
如果条件表达式结果为false,则运算表达式2;
例如:*/
int h=5,y;
y=(h<3)?200:400;
大部分和生活里面的运算是一样的,有个特殊情况需要注意。
例如:*/
int x = 6570;
x = x/1000*1000;
/*
上面运算中,如果按照生活中的运算结果应该还是6570.
但在JAVA虚拟机中的运算结果是6000.
因为6570除以1000的结果是6.57,JAVA是强类型语言,x为int类型,在这一步的时候,底层自动将
6.57转为整数,也就是6. 6乘以1000得到的结果是6000.
这是JAVA的特点,需要注意。
% 取余,模运算 两数相除,如果有余数就只取余数,如果没有则是0.
例如:
*/
int a=5%3;
/*
这里,5除以3等于1,余数为2.模运算就是取余数,所以得到的结果是2.
没有余数时得到的结果就是0.
如果左边的数小于右边的数,无法运算,结果直接就是左边的数。
比如 2%5 无法运算,结果就直接是2.
+号同时也是连接符,用于输出时与字符串连接。
++ 自增1 -- 自减1
赋值运算符:= += -= *= /= %= (赋值 加等 减等 乘等 除等 模等 )
= 就是赋值 右边的值赋给左边 x = 3 意思就是把右边的3赋给左边的x
+= 加等 将左右两边的和赋给左边。
例如:*/
int b =5;
b+=2;//b= b+2 可以这样理解(运算过程不是如此) 就是将b原来的值5加2 再赋给左边的b 所以结果是7.
//同理,减等就是将两边的差赋给左边。
int c=8;
c-=3;//结果是5.
//乘等和除等的原理同上。
//赋值运算符的特点就是遇到不一样的数据类型时,它会在底层自动进行数据类型转换。例如:
short d =5;
//d=d+2; 这里是会报错的,因为2默认是int类型。
//应该写为
d=(short)(d+2);
//这一步就是强制类型转换。
/*
比较运算符:> 大于 < 小于 >= 大于等于 <=小于等于 == 等等于 != 不等于
比较运算符是判断表达式的结构符号,结果只能是true和false
逻辑运算符:用于连接两个Boolean类型的判断表达式。
&:与符号。 */
int e=7;
//System.out.println(2<e&10>e);
/*
Boolean表达式的结果只能是true或false &与符号用于连接两边表达式的正确性再进行判断
上面我们定义的e为7 2<7 同时 10>7 两边表达式的结果都为true 所以它的结果也是true。
&与符号的运算特点:
true & true = true;
true & false = false;
false & true = false;
false & false = false;
说明在&与运算中,只有两边表达式为true 结果才能为true,否则都为false。
|:或运算符的特点:
true | true = true;
false | true = true;
true | false = true;
false | false = false;
说明在|或运算符中,只有两边都为false时结果才为false,其余都是true。
^异或运算符特点:
true ^ true = false;
false ^ true = true;
true ^ false = true;
false ^ false = false;
和|的唯一区别是两边为true时,结果为false。其余和|或运算符的结果全部一样。
意思说两边结果相同时为false,不同时为true。
! 非运算符,判断事物的另一面。
!true = false; 非真就是假
!false = true; 非假就是真
&& 双与
和&与的运算结果一样,只是过程有区别。
&是无论左边的运算结果是什么,右边都参与运算。
&&是只要左边为false,右边不参与运算,即短路。
|| 双或
和|的运算结果一样,过程有区别。
|是无论左边的运算结果是什么,右边都参与运算。
||是只要左边为true,右边不参与运算,即短路。
&和&&的区别 |和||的区别很可能是面试题,一定要重点掌握。
位运算符:用于二进制位运算的符号。
&运算符 &不仅是逻辑运算符,同时也是位运算符。
比如 6&3 它的结果应该是这么来的
位运算是二进制运算,所以得把两个数转换成二进制数再进行运算
为了方便,这里不再将两个数的32位全部写出来,只保留有效位即可。
6的二进制数为 0110 3的二进制数为 0011
在二进制中 0就是false 1就是true 所以
0110
&0011
0010 二进制转换过来是2 它的结果就是2
&运算的判断结果参考&作为逻辑运算符是的判断方法。两个为true才为true,也就是1.
|运算符:和&一样,同是逻辑运算符,也是位运算符
比如 6|3 算法与上面同理,判断结果也是根据|作为逻辑运算符时的结果。
0110
|0011
0111 转换过后是7 所以结果是7
^异或运算符
6^3 ^异或的特点就是两边相同为false,不同为true。
0110
^0011
0101 转换过来是5
^异或有个特点:
一个数被同一个数异或两次后得到的还是原数。这个特点可以用于数据加密。
总结:&与运算 |或运算 ^异或运算 这三种运算方法,有一个共同的特点。
那就是相运算的两个数位置即使互换,结果还是一样。
~反码,数值取反。
整数的负数二进制表现形式为取反再加1
这里就只是取反 未加1 所以一个整数取反的数就是他的负数再减1.
~8 的反码是 -9 ~7的反码是-8 就是这样
反码不常用,几乎不用。
<< 左移运算符
3<<2
首先还是转换为二进制,这里涉及到移位,为方便理解,把全部字节都写出来
0000-0000 0000-0000 0000-0000 0000-0011
左移两位就是将整个数值的字节往左移动两个数值并舍弃 后面空出来的两个数值位用0弥补。
得到的结果就是:
0000-0000 0000-0000 0000-0000 0000-1100
也就是12
由此我们可以看出 一个数左移一位得到的数就会是原数的2倍,也就是乘以2.再移动一位就再乘以2.
一个数左移几位其实就是该数乘以2的几次方。
>>右移运算符。和左移差不多。
需要注意的是,右移时,原数最高为是0就拿0补位,是1就用1补位。
同样我们可以看出特点 右移几位其实就是该数除以2的几次方、
例如:8>>2 得到的结果2.
>>>无符号右移 和右移原理是完全相同的
区别在于 无符号右移时,不管原数最高位是什么,都拿0去补位。
练习,将两个变量的值进行互换。
通常情况下,我们应该建立一个临时的第三方变量来进行存储,然后再互换前两个变量。
*/
int f=3,g=6;
/*int h;
h=f;//这里h等于3
f=g;//这里f等于6
g=h;//这里g等于3
//再提一个要求,再不允许使用第三方变量的情况下,我们应该怎么互换?
//我们可以用两者的和来进行运算。
f=f+g;//这里f=3+6
g=f-g;//g=3+6-6;g=3;
f=f-g;//f=3+6-3;f=6;
不过这种方式不建议用,因为如果两数过大,超出数据类型范围的话,容易强制转换,数据丢失。
我们知道一个数异或同一个数两次还能得到原数,所以这里我们可以用异或来解决问题。
*/
f=f^g;//这里f的值开始变化。
g=f^g;//3^6^6=3;g=3;
f=f^g;//3^6^3=6;f=6;
/*不过这种方式阅读性很差,一般面试才会用。
开发时一般还是用第三方变量方式比较多,阅读性强,好理解。
三元运算符: (条件表达式)?表达式1:表达式2;
如果条件表达式结果为true,则运算表达式1;
如果条件表达式结果为false,则运算表达式2;
例如:*/
int h=5,y;
y=(h<3)?200:400;