Java学习笔记-Day04 Java运算符
一、二进制与十进制之间的转换
1、十进制转换成二进制
1.1、正整数
将十进制数除以2,在下面标出商,在旁边标出余数。然后,将得到的商再除2,依次类推直到商为0时,最后将旁边的余数倒着写出来,高位补上0。正数二进制的符号位(首位)是0。
口诀:除2取余,逆序排序。
1.2、负整数
先将对应的正整数转换成二进制后得到原码,负数二进制的符号位(首位)是1,对二进制取反得到反码,然后对结果再加1得到补码。
1.3、小数
用2乘以十进制小数,将积的整数部分取出,如此进行,直到积中的小数为0,或者达到所要求的精度为止。然后把取出的整数部分按顺序排列。
口诀:乘2取整,顺序排列。
1.4、带有小数的整数
先将整数部分转换成二进制,再将小数部分转换成二进制,最后将整数部分的二进制与小数部分的二进制结合,得到带有小数的整数的二进制。
2、二进制转换成十进制
先将二进制数补齐位数,首位是0就表示是正数,首位是1则表示是负数。
(1)正整数的二进制:将二进制中的位数的权分别与对应的值相乘,然后累加得到的就是十进制。
(2)负整数的二进制:需要取反再加1(符号位不变,其余位数取反,再加上1)。然后,将二进制中的位数的权分别与对应的值相乘(符号位除外),进行累加求和,最后在该数前添加一个负号,就得到该负数的十进制。
二、位运算符
运算符 | 运算 | 范例 |
---|---|---|
& | 位与 | 1&0=0 1&1=1 0&0=0 |
| | 位或 | 1 | 0=1 1 | 1=1 0 | 0=0 |
^ | 异或 | 1^0=1 1^1=0 0^0=0 |
<< | 左移位 | 11<<1=22 |
>> | 右移位 | 11>>1=5 -11>>1=-6 |
>>> | 无符号右移 | 11>>>1=5 -11>>>1=2147483642 |
~ | 取反 | ~6= -7 ~ - 6=5 |
(1)& 位与
先将十进制转换成二进制,再对二进制数的每一位进行位与操作,操作结束后再转换成十进制。
(2)| 位或
先将十进制转换成二进制,再对二进制数的每一位进行位或操作,操作结束后再转换成十进制。
(3)^异或
先将十进制转换成二进制,再对二进制数的每一位进行异或操作,操作结束后再转换成十进制。
(4)<< 左移位
将操作数的所有二进制向左移位,右边空位补0,左边移去的部分舍去。
(5)>> 右移位
将操作数的所有二进制向右移位,左边的空位根据原数的符号位补0或补1(原来是正数就补0,是负数就补1)。
(6)>>> 无符号右移
将操作数的所有二进制向右移位,左边的空位补0(不考虑原数正负)。
(4)~取反
对一个操作数的二进制位取反。
三、逻辑运算符
操作的数据为boolean类型,结果也为boolean类型。
运算符 | 运算 | 范例 |
---|---|---|
& | 与 | false & true=false true & false=false true & true=true false & false=false |
| | 或 | false | true=true true | false=true true | true=true false | false=false |
&& | 短路与 | false && true=false true && false=false true && true=true false && false=false |
|| | 短路或 | false || true=true true || false=true true || true=true false || false=false |
^ | 异或 | true ^ false=true true ^ true=false false ^ false=false |
! | 取反 | ~true=false ~false=true |
(1)与 & :同真为真,一假为假。
(2)或 | :一真为真,同假为假。
(3)短路与 && :同真为真,一假为假。但是如果左边已经为false,则右边的表达式不执行。
(4)短路或 || :一真为真,同假为假。但是如果左边已经为true,则右边的表达式不执行。
(5)非 ! :真假相对。
(6)异或 ^:运算符两边的boolean值不相同,结果为true。运算符两边的boolean值相同,结果为false。
四、条件运算符
语法:判断条件? 表达式1 : 表达式2
当判断条件值为true时,返回表达式1的值,否则返回表达式2的值;•往往用来为变量赋值
/**
* 使用条件运算符完成计算两个数字中的最大值
*
*/
public class Demo01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 10;
int b = 5;
// 条件运算符 判断条件?表达式1:表达式2
// 判断条件成立,执行表达式1。判断条件不成立,执行表达式2。
int max = a>=b?a:b;
System.out.println(max);
}
/**
* 使用条件运算符完成计算三个数字中的最大值
*
*/
public class Demo02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 10;
int b = 50;
int c = 100;
// 将a与b进行比较,如果a大,再将a与c进行比较,如果b大,将b与c进行比较
int max = a>=b?(a>=c?a:c):(b>=c?b:c);
System.out.println(max);
}
}
如果表达式1与表达式2的数据类型不同,表达式的输出结果将会自动转换成精度最大的那个类型。
public class Demo {
public static void main(String[] args) {
int x=4;
System.out.println("value is "+((x>4)?99.9:9));// value is 9.0
}
}
五、算术运算符
- +(连接字符串):表达式中需要有字符串。
- /(除):如果变量是整形,/ 进行整除运算,结果是商的整数部分。
- %(取模):进行取模运算,结果是余数部分。
- (自增) ++:1、a++(先引用,后自增1) 2、++a(先自增1,后引用)
- (自减) - -:1、a - -(先引用,后自减1) 2、- - a(先自减1,后引用)
六、关系运算符(比较运算符)
- 关系运算符的运算结果为boolean类型。
== 运算符的作用
(1) 如果作用于基本数据类型的变量,则是比较其存储的值是否相等。
(2)如果作用于引用类型的变量(如 String),则比较的是所指向对象的地址,也就是是否指向同一个对象。
注意:
① == 将左侧和右侧的值转换成二进制来比较。
0.3转换为二进制为 0.010011001100110011…
② double和float的精度不同,double的精度为15 ~ 16位,float的精度为7 ~ 8位。
a的二进制为 0.010011001100110,b的二进制为0.0100110。
所以 a == b为false。
七、赋值运算符
赋值运算符的优先级是最低的。
赋值运算符 | 运算规则 | |||
---|---|---|---|---|
= | 赋值 | a=1; | ||
+= | 加后赋值 | a += 1; | 相当于 | a = a+1; |
-= | 减后赋值 | a -= 1; | 相当于 | a = a-1; |
*= | 乘后赋值 | a *= 1; | 相当于 | a = a*1; |
/= | 除后赋值 | a /= 1; | 相当于 | a = a/1; |
%= | 取模后赋值 | a %= 1; | 相当于 | a = a%1; |
&= | 位与后赋值 | a &= 1; | 相当于 | a = a&1; |
= | 位或后赋值 | a | = 1; | |
~= | 取反后赋值 | a ~= 1; | 相当于 | a = a~1; |
<<= | 位左移后赋值 | a <<= 1; | 相当于 | a = a<<1; |
>>= | 位右移后赋值 | a >>= 1; | 相当于 | a = a>>1; |
>>>= | 位无符号右移后赋值 | a >>>= 1; | 相当于 | a = a>>>1; |
八、运算符优先级
Java中除了赋值运算符的结合性为“先右后左”,其它所有运算符的结合性都是”先左后右”。