运算符
1 算术运算符
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
+ | 正号 | +3 | 3 |
- | 负号 | b=3;-b; | -3 |
+ | 加 | 5+5 | 10 |
- | 减 | 6-4 | 2 |
* | 乘 | 3*4 | 12 |
/ | 除 | 5/5 | 1 |
% | 取模(相当于相除后的余数) | 5&3(5/3得1**余2**) | 2 |
++ | 自增(前) | a=2;b=++a; (a自增后赋值给b) | a=3;b=3 |
++ | 自增(后) | a=2;b= a ++; (a赋值给b后自增) | a=3;b=2 |
-- | 自减(前) | a=2;b=–a; | a=1;b=1 |
-- | 自减(后) | a=2;b=a–; | a=1;b=2 |
+ | 字符串相加 | “he”+”llo” | hello |
取模技巧:
左边<右边,结果=左边
左边=右边,结果=0
右边=1,结果=0
结果正负由左边数(被模数)正负决定
自增:相当于+1
char c = ‘你’;//char是2字节,一个中文也是2字节,可以赋值(“你好”超2字节,不能赋值)
转义字符
通过“\”来转变后面字母或符号的含义
\n:换行
\r:按下回车键;Windows系统中,回车符由两个字符表示\r\n
\b:退格
\t:制表符,相当于tab键
算术运算符的注意问题
• 如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。但被模
数是负数就另当别论。
• 对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时
,只保留整数部分而舍弃小数部分。
例如:int x = 3510; x = x / 1000 * 1000;
结果x=3000
• “+”除字符串相加功能外,还能把非字符串转换成字符串,字符串数据和任何数据使用“+”都是相连接,最终都会变成字符串
2 赋值运算符
符号:
= , +=, -=, *=, /=, %=
Eg. x**+=4;//x=x+4,把右边和左边的和赋予左边**
示例:
int a,b,c; a=b=c =3;
int a = 3; a+=5;等同运算a=a+5;
思考:
short s = 3; s=s+2;
short s = 3; s+=2;
有什么区别?
s=s+2//编译失败,因为s会被提升为int类型,运算后的结果还是int类型。无法赋值给short类型。
s+=2//编译通过,因为+=运算符在给s赋值时,自动完成了强转操作。
3 比较运算符
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
== | 相等于 | 4==3 | false |
!= | 不等于 | 4!=3 | true |
< | 小于 | 4<3 | false |
> | 大于 | 4>3 | true |
<= | 小于等于 | 4<=3 | false |
>= | 大于等于 | 4>=3 | true |
instanceof | 检查是否是类的对象 | “hello” instanceof Strihng | true |
注1:比较运算符的结果都是boolean型,也就是要么是true,要么是false。
注2:比较运算符“==”不能误写成“=” 。
4 逻辑运算符
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
& | AND(与) | false&true | false |
| | OR(或) | false|true | true |
^ | XOR(异或) | false^true | true |
true^true | false | ||
! | Not(非) | !true | false |
&& | AND(短路) | false&&true | false |
|| | OR(短路) | false||true | true |
逻辑运算符用于连接布尔型表达式,在Java中不可以 写成3<x<6,应该写成x>3 &x<6 。
“&”和“&&”的区别:
• 单&时,左边无论真假,右边都进行运算;
• 双&时,如果左边为真,右边参与运算,如果左边为假,那 么右边不参与运算。
“|”和“||”的区别同理,双或时,左边为真,右边不参与运算。
异或( ^ )与或( | )的不同之处是:当左右都为true时, 结果为false。
5 位运算符
运算符 | 运算 | 范例 |
---|---|---|
<< | 左移 空位补0,被移除的高位丢弃,空缺位补0。 | 3 << 2 = 12 ‐‐> 3*2*2=12 |
>> | 右移;最高位补0或1由原最高位决定 被移位的二进制最高位是0,右移后,空缺位补0; 最高位是1,空缺位补1。 | 3 >> 1 = 1 ‐‐> 3/2=1 |
>>> | 无符号右移;最高位只补0 被移位二进制最高位无论是0或者是1,空缺位都用0补。 | 3 >>> 1 = 1 ‐‐> 3/2=1 |
& | 与运算 二进制位进行&运算,只有1&1时结果是1,否则是0; | 6 & 3 = 2 |
| | 或运算 二进制位进行 | 运算,只有0 | 0时结果是0,否则是1; | 6 | 3 = 7 |
^ | 异或运算 任何相同二进制位进行 \^ 运算,结果是0;1\^1=0 , 0\^0=0 不相同二进制位 ^ 运算结果是1。1\^0=1 , 0\^1=1 | 6 \^ 3 = 5 |
~ | 非(反码)(相当于数值加1再加负号 \~-9=8) 二进制值:1变0 0变1 | \~6 = ‐7 |
位运算是直接对二进制进行运算。
左移右移
<<:相当于乘与2的移动位数次幂
>>:相当于除以2的移动位数次幂
移n位,就是对乘以或者除以2的n次幂。
Eg.-**8>>**3=-1 (相当于-8/23=-1)
*1*1111111 11111111 11111111 11111000
111*11111111 11111111 11111111 11111*000 右移三位,最高位补0或1由原最高位决定
^异或运算
5^7:
101
& 111 1相当于是true,0相当于false
———-
010 =2
一个数异或另一数两次,结果还是原数(7^3^3=7,实际应用:3先异或对数据7上锁,再用3异或才能读取数据7,3此时相当于安全秘钥~)
~ 非
~9=-10(相当于数值加1再加负号 ~-9=8)
00000000 00000000 00000000 00001001(原数9)
11111111 11111111 11111111 11110110(~非运算后的值-二进制中的1变0 0变1)
附:负数计算
11111111 11111111 11111111 11110110(负数,上面非运算后的值)
下面推导这个二进制值对应十进制负数具体是多少:
11111111 11111111 11111111 11110101 减1
00000000 00000000 00000000 00001010 取反,得知结果为-10
位运算符练习:
1.最有效率的方式算出2乘以8等于几?
2<<3;
2.对两个整数变量的值进行互换(不需要第三方变量)
目的:互换x和y的值
方法1:通过第三方变量(平常较常用)
方法2:通过加减运算,如果x和y值非常大,容易超出int范围
方法3:通过异或运算(答题技巧)
方法1
int z;
z=x;
x=y;
y=z;
System.out.println("x1="+x+" y1="+y);
方法2
x=x+y;//如果x和y值非常大,容易超出int范围
y=x-y;
x=x-y;
System.out.println("x2="+x+" y2="+y);
方法3
x=x^y;
y=x^y;//x两次^y,返回x的值
x=x^y;
System.out.println("x3="+x+" y3="+y);
6 三元运算符
格式
• (条件表达式)?表达式1:表达式2;
• 如果条件为true,运算后的结果是表达式1;
• 如果条件为false,运算后的结果是表达式2;
示例:
• 获取两个数中大数。
int x=3,y=4,z;
z = (x\>y)?x:y;//z变量存储的就是两个数的大数。