黑马程序员--Java语言基础组成 —运算符
2.4.4 运算符:
l 算术运算符
运算符 |
运算 |
范例 |
结果 |
+ |
正号 |
+3 |
3 |
- |
负号 |
b=4; -b; |
-4 |
+ |
加 |
5+5 |
10 |
- |
减 |
6-4 |
2 |
* |
乘 |
3*4 |
12 |
/ |
除 |
5/5 |
1 |
% |
取模 |
5%5 |
0 |
++ |
自增(前) |
a=2;b=++a; |
a=3;b=3 |
++ |
自增(后) |
a=2;b=a++ |
a=3; b=2 |
—— —— |
自减(前) 自减(后) |
a=2;b=——a; a=2;b=a——; |
a=1;b=1 a=1;b=2 |
+ |
字符串相加 |
“He”+”110” |
“Hello” |
例:
Int x=4279;
X=x/1000*1000;
结果为4000
分析:先运算x/1000,int型除以int型应该还是int型,所以是4,舍弃小数部分
在运算4*1000,结果为4000
取模运算符:%:取得是余数
例:
10%3;结果为1
2%5 结果为2
规律:左边小于右边,结果是左边
左边等于右边,结果是0
右边是1,结果是0
当出现负数时,只看左边,负号在左边结果为负
例:1%-5 结果为1
-1%5 结果为-1
++(自增运算符)与—(自减运算符);
例:
int a=3,b;
b=a++;
System.out.println(a);
System.out.println(b);
结果为3 4
分析:
a++:是给a这个变量中的值进行一次加一操作,并把+1操作后的值重新付给a,就相当于a=a+1
b=a++;因为是a++,所以是先将a的值赋给b,然后a再自增
如果是++a,是先自增,然后再进行运算
字符串连接符:“+”
字符串数据和任何数据使用+都是相连接,最终都会变成字符串
例:
System.out.println(“5+5=”+5+5);
结果为:5+5=55;
如果要想5+5进行运算,可以把提高优先级
改为:System.out.println(“5+5=”+(5+5));
结果为:5+5=10;
转义字符:
通过\来转变后面字母或者符号的含义
\n:换行
\b:退格,相当于backspace
\r:按下回车键.windows系统中回车符是由两个字符来表示\r\n。
\t:制表符,相当于tab键
想在屏幕上打印带双引号的数据,不能直接使用””,双引号用于标志字符串的,所以需要转移”的含义:\”
System.out.println(“\”hello\””);
要打印两端都有\\的数据,需要转义\的含义:\\
System.out.println(“\\hello\\”);
l 赋值运算符
符号:
=、+=、-=、*=、、=、%=
示例:
a+=5等同运算a=a+5;
a-=5等同运算a=a-5;
a*=5等同运算a=a*5;
a/=5等同运算a=a/5;
a%=5等同运算a=a%5;
short a=3;
s=s+2;
s+=2;
/*两种方式不同处是:
- s=s+2;这样写编译时是报错的,s+=2;用这种方法编译通过
- s=s+2; 是两次运算,先计算s+2,然后再复制:s是short类型,s+2被提升成int类型,运算完再赋给s,装不下了,会丢失精度, s+=2:就是一次运算,只做赋值运算,把左右两边值的和赋给左边,并且此种方式内部有自动转换动作,它就相当于short s=4;将4赋给s,进行自动转换
*/
l 比较运算符
运算符 |
运算 |
范例 |
结果 |
== |
相等 |
4==3 |
false |
!= |
不等于 |
4!=3 |
ture |
< |
小于 |
4<3 |
false |
> |
大于 |
4>3 |
true |
<= |
小于等于 |
4<=3 |
false |
>= |
大于等于 |
4>=3 |
false |
instainceof |
检查是否是类的对象 |
‘Hello’instanceof String |
ture |
注1:比较运算符的结果都是boolean型,也就是要么是ture,要么是false
注2:比较运算符“==“不能误写成”=“,单等号是赋值运算符
l 逻辑运算符
运算符 |
运算 |
范例 |
结果 |
& |
AND(与) |
false&ture |
false |
| |
OR(或) |
False|ture |
true |
^ |
XOR(异或) |
False^ture |
true |
! |
Not(非) |
!true |
false |
&& |
AND(短路) |
false&&ture |
false |
|| |
OR(短路) |
False||ture |
true |
逻辑运算符用于连接boolean类型的表达式
true &true=true;
true &false=false;
false&true=false;
false &false=false;
&:只要两边的boolean表达式结果有一个为false,那么结果就是false
只有两边都为true,结果为true
true | true=true;
true | false=true;
false | true=true;
false | false=false;
|:两边只要有一个为true,结果为true,只有两边都有false,结果为false
^:异或:^就是和]|有点不一样
true ^true=false;
true ^ false=true;
false ^ true=true;
false ^ false=false;
^:两边相同结果是false
两边不同结果是true
&和&&的特点:
&:无论左边是是真是假,右边都运算
&&:当左边为假时右边不运算
|和||的特点
|:两边都参与运算
||:当左边为true,右边不运算
l 位运算符
位指的是2进制
运算符 |
运算 |
范例 |
<< |
左移 |
3 << 2 = 12 à3 * 2 * 2 = 12 |
>> |
右移 |
3 >> 1 = 1 à 3 / 2 = 1 |
>>> |
无符号右移 |
3 >>> 1 = 1 à3 / 2 = 1 |
& |
与运算 |
6 & 3 = 2 |
| |
或运算 |
6 | 3 = 7 |
^ |
异或运算 |
6 ^ 3 = 5 |
~ |
反码 |
~6 = -7 |
例:3<<2 相当于3*2(2)=12
是将3转换成2进制,然后向左移两位,末尾处补0,结果是:12
6>>2 相当于6/2(2)=1;舍弃小数部分
将6转换成2进制,然后向右移两位,高位补的要与最高位一致(是带符号右移),结果为:1
规律:
<<:其实就是乘以2的移动位数次幂
>>:就是除以2的移动的位数次幂,当结果为小数时,舍弃小数
无符号右移:
>>与>>>的区别
>>:最高位补什么由原有数据的最高位的值而定,如果最高位为0,右移后用0补空位,如果最高位是1,右移后用1补空位
>>:无论最高位是什么,右移后都用0补
位运算符&
6&3=2
先将6和3转换成2进制
然后运算:
位运算符|
6|5=7
先将6和5转换成2进制
然后在运算
位运算符^
6^5=
现将6和5转换成2进制
然后运算
例:7^4^4=7
结论:一个数异或同一个数两次,结果还是这个数本身
~反码:就是取反
~6=-7
先将6转换成2进制为:0000-0000-0000-0000-0000-0000-0000-0110
再取反为: 1111-1111-1111-1111-1111-1111-1111-1001
想算去取反后的这个输的值要减再取反
1111-1111-1111-1111-1111-1111-1111-1001
- 0000-0000-0000-0000-0000-0000-0000-0001
= 0000-0000-0000-0000-0000-0000-0000-1000
然后取反
1111-1111-1111-1111-1111-1111-1111-0111
结果为-7
练习
位运算练习:
- 最有效的方式算出2乘以8等于几?
最有效的方式是:按位运算,2<<3(2往左移3位)
- 对两个整数变量的值进行互换(不需要第三方变量)
方法1:使用第三方变量
int temp;
temp=n;
n=m;
m=temp;
方法2:
n=n+m;//如果n和m的值非常大,容易超出int范围
m=n-m;
n=n-m;
方法3:使用^运算符:原理是:一个数异或同一个数两次,结果还是这个数本身
n=n ^ m;
m=n ^ m;//(n ^ m) ^ m
n=n ^ m;//(n ^ m) ^ n;
用位运算符进行16进制转换
class Num
{
public static void main(String[] args)
{
int num=60;
//获取60的最低4位,通过&15;
int n1=num&15;
System.out.println((char)(n1-10+'A'));
//要获取下一组4位,将60右移4位
int temp =60>>>4;
//对temp的值进行最低四位的获取
int n2 =temp & 15;
System.out.println();
}
}
l 三元运算符
格式:
(条件表达式)?表达式1:表达式2;
如果条件为false,运算后的结果是表达式1;
如果条件为false,运算后的结果是表达式2;
例:
int x=1,y;
y=(x>1)?100:200;
System.out.println(“y=”+y);
结果:y=100