专业的JAVA编程教程与资源

网站首页 > java教程 正文

初识Java—(七)数据类型及运算符(3)

temp10 2024-10-13 09:27:05 java教程 8 ℃ 0 评论

3.7 运算符

运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。Java语言使用运算符将一个或多个操作数据连接成执行性语句,用以实现特定功能。

算术运算符

初识Java—(七)数据类型及运算符(3)

赋值运算符

比较运算符

逻辑运算符

位运算符

类型相关运算符

3.7.1 算术运算符

加法运算(+)、减法运算(-)、乘法运算(*)、除法运算(/)、取余(取模)运算(%)、自加运算(++)、自减运算(--)、(+)还可以做为字符串的连接符。

举例1:

int a = 12;
int b = 24;
System.out.println("加法运算:"+(a+b));
System.out.println("减法运算:"+(a-b));
System.out.println("乘法运算:"+a*b);
System.out.println("除法运算:"+a/b);
System.out.println("取模运算:"+a%b);
int c = --a; //先自己做了一次自减运算,再将a的值给了c
System.out.println(c);
System.out.println(a);
c = b--; //先将b的值给了c,然后再自己做了一次自减运算
System.out.println(c);
System.out.println(b);

int x = 4;
int y = (x++)+(++x)+(x*10);
System.out.println(“x:”+x);
System.out.println(“y:”+y);

System.out.println("hello"+'a'+1);
System.out.println('a'+1+"hello");

System.out.println("5+5="+5+5);
System.out.println(5+5+"=5+5");
//字符串数据和其他数据做+,结果是字符串类型。
//这里的+不是加法运算,而是字符串连接符。

3.7.2 赋值运算符

Java使用“=”作为赋值运算符,为变量指定变量值。举例:

int a = 5; String b = “abc”;

3.7.3 位运算符

Java支持的运算符有7个:按位与(&)、按位或(|)、按位非(~)、按位异或(^)、左移运算符(<<)、右移运算符(>>)、无符号右移运算符(>>>)。使用位运算符,我们必须先把数据换算成二进制,然后再参加运算。

基本运算法则

第一个运算数

第二个运算数

按位与(&)

按位或(|)

按位异或(^)

0

0

0

0

0

0

1

0

1

1

1

0

0

1

1

1

1

1

1

0


按位非运算,举例:

int a = 19; System.out.println(~a); //输出结果为-20

运算原理:19的二进制表示方式为:0001 0011按位非运算为:1110 1100 按位计算后的值为补码,(计算机都是按照补码进行表示的),根据补码获取它的反码,前面为1表示为负数,负数的反码是:补码减1,因此其反码为1110 1011,其原码为1001 0100,转换成十进制为-20。


按位异或运算有一个特点:一个数据对另一个数据异或两次,该数本身不变。

int a = 5;
int b = 6;
System.out.println(a^b^b);
System.out.println(a^b^a);


位移运算符:转换为32位后再参加运算。

左移运算:把第一个操作数的二进制码向左移动指定位数,右边空出来的位数以0填充。正数直接换算成二进制就可以了。


右移运算:Java的右移运算符有两个>>和>>>,对于>>运算符,把第一个操作数的二进制码向右移动指定位数后,左边空出来的位数以原来的的符号位填充,如果是正数用0填充,如果是负数用1填充,>>>运算符移动后,只用0填充。

举例:

-5>>2
-5的原码是 1000 0101,
它的反码为:1111 1010,
它的补码为:1111 1011,
右移两位为: 1111 10,
前面用符号位填充为:1111 1110(补码)。
将补码转换成十进制数:
先变成反码:1111 1101,
其原码为:1000 0010,
表示十进制数为:-2。

-32<<3 这个问题。 -256


注意了:

正数的的位移可以这么做。

<< 就是把<<左边的数据乘2的移动次幂。例如:3<<2 3*2^2 = 12;

>> >>>就是把>>左边的数据除2的移动次幂。例如:24>>2 24/2*2 = 6;

面试题:

一、实现两个整数变量的交换。

int a = 4; int b = 5;
1. 借助第三个变量。
2. 使用位异或运算符实现
左边:a,b,a
右边:a^b
a = a^b;
b = a^b;
a = a^b;

3. 用变量相加的做法
a = a+b;
b = a-b;
a = a-b;
再看看这个的值传递?
4. 一个组合语句
b = (a+b) – (a=b);
还是一个值的相互变换~

二、请用最有效率的方式写出计算2乘以8的结果?

2<<3 2*2^3

因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2 << 3。

3.7.4 扩展后的赋值运算符

赋值运算符可以与算术运算符、位移运算符结合,扩展成为功能更加强大的运算符。

+=:对于x += y,表示 x = x + y;
-=:对于 x-= y,表示 x = x-y;
*=: x*= y,表示 x = x * y;
/= ; %=; &=; |=; ^=; <<= ; >>=; >>>=;


1.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

对于short s1 = 1; s1 = s1 + 1;由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。

对于short s1 = 1; s1 += 1;由于 +=是java语言规定的运算符,java编译器会对它进行特殊处理,隐藏着一个强制类型转换,因此可以正确编译。For:S1 = (short)(s1+1);

3.7.5 比较运算符

比较运算符用于判断两个变量或者常量的大小,比较运算的结果是一个boolean值(true或者false)

>:大于,只支持左右两边操作数是数值类型。

>=:同上

<:同上

<=:同上

==:同上,即使他们数据类型不相同,只要它们的值相同,也返回true,例如:97==’a’,返回true

? !=:不等于,如果进行比较的两个操作数都是数值类型,只要值不同就返回true,如果比较的是引用类型,只有当两个引用变量相同类型的实例时才可以比较,只要两个引用指向不是同一个对象就返回true,

举例1:

Car car1 = new Car();
TestCar car2 = new TestCar();
boolean result = (car1 ==car2); //两个类型不同不能进行比较

举例2:

Car car1 = new Car();
Car car2 = new Car();
boolean result1 = car1 !=car2;
boolean result2 = car1 ==car2;
System.out.println(result1); //输出结果为true
System.out.println(result2); //输出结果为false


举例3:

Car car1 = new Car();
Car car2 = car1;
boolean result = car1 ==car2;
System.out.println(result); //输出结果为true

3.7.6 逻辑运算符

逻辑运算符用于操作两个布尔型的变量或常量,逻辑返回的值为boolean类型,主要有6个,

&&:前后两个操作数都为true时,返回true,否则返回false,例如:32>24 &&“abc”==”abc”,返回true。在Java中,3<X<6这样写是错误的,要写成x>3&&x<6。

||:前后两个操作数,有个为true就返回true,举例:32>24 || “abc”!=”abc”,返回true

&(不短路与),|(不短路或),!(非)^(异或)

l “&”和“&&”的区别:

? 单&时,左边无论真假,右边都进行运算;

? 双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。

“|”和“||”的区别同理,双或时,左边为真,右边不参与运算。那你们说我们开发时用哪个?

l 异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。

3.7.7 三目运算符

格式:

(关系表达式)?表达式1:表达式2;

如果条件为true,运算后的结果是表达式1;

如果条件为false,运算后的结果是表达式2;

举例:

int a= 5>3 ? 6 : 7;

int a = 3; int b = 4; int c = 5; 用三目运算符求出最大值。

(1) 可以用两个中间值作为接收结果来比较。

(2) 直接一步搞定。(a>b)?((a>c)?a:c):((b>c)?b:c);

3.7.8 运算符的优先级

运算符说明

Java运算符

分隔符

. [] () , ;

单目运算符

++ -- ~ !

强制类型转换

(type)

乘除取模运算符

* / %

加减运算符

+ -

位移运算符

<<>>>>>

关系运算符

<<= >>=

等价运算符

== !=

按位与运算

&

按位异或运算

^

按位或运算

|

条件与运算

&&

条件或运算

||

三目运算符

? :

赋值运算符

= += -= *= /= &= |= ^= %= <<= >>= >>>=

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表