Day09——运算符
基本运算符
运算符
Java 语言支持如下运算符: (重点掌握前4个)
算术运算符:+、-、*、/、%、++; --
赋值运算符: =
关系运算符:>、<、>=、<=、==、!=、instanceof(稍后再讲)
逻辑运算符:&&、||、!
位运算符:&、|、^、~、>>、<<、>>>;(了解)
条件运算符: ? :
扩展赋值运算符:+=、-=、*=、/=。
详细解释:
/ 除法
% 取余 左操作数除以右操作数的余数
= 赋值运算符,将右操作数的值赋给左侧操作数,C = A + B将把A + B得到的值赋给C
== 判断如果两个操作数的值是否相等,如果相等则条件为真。
!= 判断如果两个操作数的值是否不相等,如果值不相等则条件为真。
按位与(&) :对两个整数的二进制表示的每一位进行与运算。只有当两个相应位都为 1 时,结果位才为 1,否则为 0。 例如:5(二进制为 0101)& 3(二进制为 0011),结果为 0001,即 1。
按位或(|):对两个整数的二进制表示的每一位进行或运算。只要两个相应位中有一个为 1,结果位就为 1。 例如:5(二进制为 0101)| 3(二进制为 0011),结果为 0111,即 7。
按位异或(^):对两个整数的二进制表示的每一位进行异或运算。当两个相应位不同时,结果位为 1,相同时为 0。 例如:5(二进制为 0101)^ 3(二进制为 0011),结果为 0110,即 6。
按位取反(~):对一个整数的二进制表示的每一位进行取反操作。0 变为 1,1 变为 0。 例如:~5(二进制为 0101),结果为 1010,由于计算机中以补码形式存储,所以结果为 -6。
左移(<<):将一个整数的二进制表示向左移动指定的位数。左移一位相当于乘以 2。 例如:5(二进制为 0101)<< 1,结果为 1010,即 10。
右移(>>) :将一个整数的二进制表示向右移动指定的位数。正数右移一位相当于除以 2,负数右移时,高位补符号位。 例如:5(二进制为 0101)>> 1,结果为 0010,即 2。
无符号右移(>>>): 无论操作数是正数还是负数,无符号右移都用 0 填充高位。 例如:-5(二进制为 11111111111111111111111111111011)>>> 1,结果为 01111111111111111111111111111101,即 2147483645。
逻辑运算符:判断与 或 非的关系 and or
//二元运算符 两个数的运算
//Ctrl+D 复制当前行到下一行
int a=10;
int b=20;
int c=25;
int d=25;
System.out.println(a+b);
System.out.println(a-b);
System.out.println(a*b);
System.out.println((double)a/b); //在计算时,要小心结果小数部分四舍五入的问题。可以把一个数转换类型
不同整数类型计算,结果类型
//不同整数类型相加,结果的类型研究
long a=123123123123123l;
int b=123123123;
short c=17;
byte d=1;
System.out.println(a+b+c+d);//long类型
System.out.println(b+c+d); //int类型
System.out.println(c+d); //int类型
//在这段代码中,c是short类型,d是byte类型。当进行c + d运算时,Java 中会将byte和short类型自动提升为int类型进行计算。
/*
总结:
不同整数类型相加,有long类型参与,结果为long类型;
没有long类型参与,结果为int类型
当byte和short类型进行计算时,byte和short类型自动提升为int类型进行计算。
*/
总结:
不同整数类型相加,有long类型参与,结果为long类型;
没有long类型参与,结果为int类型
当byte和short类型进行计算时,byte和short类型自动提升为int类型进行计算。
不同整数类型的范围
在 Java 中,byte
、short
、int
和long
都是整数类型,它们的取值范围如下:
-
byte
: - 占用 1 个字节(8 位)。 - 取值范围是 -128 到 127。这是因为使用二进制补码表示法,最高位为符号位,0 表示正数,1 表示负数。具体范围计算为 -2 的 7 次方到 2 的 7 次方减 1,即 -128 到 127。 -
short
: - 占用 2 个字节(16 位)。 - 取值范围是 -32768 到 32767。同样采用二进制补码表示法,范围为 -2 的 15 次方到 2 的 15 次方减 1。3.
int
: - 占用 4 个字节(32 位)。 - 取值范围是 -21_4748_3648 到 21_4748_3647。范围为 -2 的 31 次方到 2 的 31 次方减 1。4.
long
: - 占用 8 个字节(64 位)。 - 取值范围是 -922_3372_0368_5477_5808 到 9223372036854775807。范围为 -2 的 63 次方到 2 的 63 次方减 1。
不同浮点数类型相加,结果的类型研究
//不同浮点数类型之间的计算
float i1=1.5f;
double i2=3.0;
System.out.println(i1/i2); //double类型
//总结: float和double之间计算,结果为double
总结:
float和double之间计算,结果为double
float和double存储大小和精度
- 存储大小
float
占用 4 个字节(32 位)。double
占用 8 个字节(64 位)。
- 精度
double
的精度比float
高得多。具体来说,float
可以提供大约 6 - 7 位有效数字,而double
可以提供大约 15 - 16 位有效数字。
整数与浮点数之间的计算
//整数与浮点数之间的计算
System.out.println(a+i2);//1.231231231231237E15 double类型
System.out.println(b+i1);//1.2345679E8 float类型
/*
在这段代码中,int类型的b与float类型的i1进行计算。
计算结果为:123456789 + 1.5f等于123456790.5。
结果类型是float类型经过自动类型提升后的float类型
(因为int和float运算时,int会自动提升为float)。
但是如果直接打印,由于System.out.println在打印float和double类型时,会将其转换为String类型输出,可能会以小数形式输出结果。
*/
//为了输出b+i1的准确结果,在已知结果是float类型时,可以使用System.out.printf进行格式化输出,可以控制输出的小数位数,这里设置输出结果保留两位小数。这样可以更准确地查看结果。
float result = b + i1;
System.out.printf("b + i1 的结果为:%.2f%n", result);
总结:
1.整数与浮点数计算,结果的类型和浮点数的类型保持一致。浮点数类型为float,结果为float;浮点数类型为double,结果为double;
2.在Java中,当你看到一个数值以科学计数法的形式表示,如 1.231231231231237E15
,这通常意味着该数值是一个double
类型的浮点数.浮点数的小数部分通常无法精确表达,也就无法准确知道小数点后有多少位。也可以说,因为这个数后面没有带f,因为这个数小数点后有效数字超过7位,所以不是float类型
- System.out.println在打印float和double类型时,会将其转换为String类型输出,可能会以小数形式输出结果。
关系运算符
//关系运算符返回的结果:正确、错误 布尔值
int i1=10;
int i2=12;
System.out.println(i1==i2);//false
System.out.println(i1!=i2);//true
System.out.println(i1<i2);//true
System.out.println(i1>i2);//false
System.out.println(i1<=i2);//true
System.out.println(i1>=i2);//false
System.out.println(i2%i1); //2
自增自减运算符
//++ -- 自增 自减 一元运算符 难点!!!!!!!!!!!!!!
int a=3;
int b=a++; //a++ a先赋值给b,然后a自增 a=a+1
//a=4;b=3
int c=++a; //++a a先自增,再给b赋值
System.out.println(c);//c=5
System.out.println(a);//a=5
/*
System.out.println(a);//5
System.out.println(a);
System.out.println(b);//3
System.out.println(b);
System.out.println(c);//5
System.out.println(c);
*/
//一定要上手算一遍,才知道a++和++a的区别!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
要点:
a++ a先赋值给b,然后a自增
++a a先自增,再给b赋值
幂的计算
//拓展——幂的计算
System.out.println(Math.pow(2,3));//8.0
//Math.pow()方法返回数据是double类型
总结:
Math.pow()方法返回数据默认是double类型
逻辑运算符
//逻辑运算符
//与(and) 或(or) 非(取反)
boolean a=true;
boolean b=false;
System.out.println("a&&b:"+(a&&b)); //false 逻辑与运算:两个结果都为真,结果才为真
System.out.println("a||b:"+(a||b)); //true 逻辑或运算:有一个结果为真,结果为真
System.out.println("!a&&b:"+!(a&&b));//true 逻辑非运算:如果是真,则为假
System.out.println("==============================");
//短路运算:
// 当a&&b,a为false时,程序会不会检查b的情况?
int c=5;
boolean d=(c>6)&&(c++<1);
System.out.println(d);//false
System.out.println(c);//5 (c++<1)没有被程序所运算
//总结:当a&&b,a为false时,程序不会检查b的情况而直接输出false
总结:
&& 与运算:两个结果都为真,结果才为真
|| 或运算:有一个结果为真,结果为真
! 非运算:如果是真,则为假
位运算符
//位运算符 位运算效率高
/*
A=0011 1100
B=0000 1101
-------------------------------------------------------------
A&B 0000 1100 & 与 两位相同为0,不同为1
A|B 0011 1101 | 或 两位有1个1,就为1
A^B 0011 0001 ^ 异或 两位不同为1,相同为0
~b 1111 0010 ~ 相反 1变0;0变1
<< 左移 相当于乘二
>> 右移 /2
-------------------------------------------------------------
*/
//利用位运算符快速计算2*8 2*2*2*2
System.out.println(2<<3);
/*
0000 0000 0
0000 0001 1
0000 0010 2
0000 0011 3
0000 0100 4
0000 1000 8
0001 0000 16 每乘一个2,二进制的1就左移1位
*/
注意:
& 与 对应的两个二进位均为1时,结果位才为1 ,否则为0。
| 或 两位有1个1,就为1
- ^ 异或 两位不同为1,相同为0
- 相反 1变0;0变1
<< 左移 相当于乘二
扩展赋值运算符
//扩展赋值运算符 可偷懒
/*int a=10;
int b=20;
//a+=b; //a=a+b
a-=b; //a=a-b
System.out.println(a); //-10
System.out.println(b); //20
System.out.println(a+b); //10
*/
总结:
a+=b 相当于 a=a+b
a-=b 相当于 a=a-b
字符串连接符
//字符串连接符 +
int i1=10;
int i2=20;
System.out.println(i1+i2);//30
System.out.println(""+i1+i2);//1020 字符串在前面,后面的会进行拼接;
System.out.println(i1+i2+"");//30 字符串在后面,前面的会进行运算
//注意:""+i1+i2 和 i1+i2+"" 含义不一样
注意:
""+i1+i2 和 i1+i2+"" 含义不一样
三元运算符
//三元运算符 ? :
//x ? y : z
//如果x==true,结果为y;否则结果为z
int score=55;
String result=score<60 ? "成绩不及格":"成绩及格";
System.out.println(result);//成绩不及格
总结:
x ? y : z
如果x==true,结果为y;否则结果为z