您的位置:首页 > 编程语言 > Java开发

JAVA基础之运算符

2016-05-22 13:10 417 查看
算术运算符:+ - * / (加减乘除)

大部分和生活里面的运算是一样的,有个特殊情况需要注意。

例如:*/

int x = 6570;

x = x/1000*1000;

/*

上面运算中,如果按照生活中的运算结果应该还是6570.

但在JAVA虚拟机中的运算结果是6000.

因为6570除以1000的结果是6.57,JAVA是强类型语言,x为int类型,在这一步的时候,底层自动将

6.57转为整数,也就是6. 6乘以1000得到的结果是6000.

这是JAVA的特点,需要注意。

% 取余,模运算 两数相除,如果有余数就只取余数,如果没有则是0.

例如:

*/

int a=5%3;

/*

这里,5除以3等于1,余数为2.模运算就是取余数,所以得到的结果是2.

没有余数时得到的结果就是0.

如果左边的数小于右边的数,无法运算,结果直接就是左边的数。

比如 2%5 无法运算,结果就直接是2.

+号同时也是连接符,用于输出时与字符串连接。

++ 自增1 -- 自减1

赋值运算符:= += -= *= /= %= (赋值 加等 减等 乘等 除等 模等 )

= 就是赋值 右边的值赋给左边 x = 3 意思就是把右边的3赋给左边的x

+= 加等 将左右两边的和赋给左边。

例如:*/

int b =5;

b+=2;//b= b+2 可以这样理解(运算过程不是如此) 就是将b原来的值5加2 再赋给左边的b 所以结果是7.

//同理,减等就是将两边的差赋给左边。

int c=8;

c-=3;//结果是5.

//乘等和除等的原理同上。

//赋值运算符的特点就是遇到不一样的数据类型时,它会在底层自动进行数据类型转换。例如:

short d =5;

//d=d+2;
这里是会报错的,因为2默认是int类型。

//应该写为

d=(short)(d+2);

//这一步就是强制类型转换。

/*

比较运算符:> 大于 < 小于 >= 大于等于 <=小于等于 == 等等于 != 不等于

比较运算符是判断表达式的结构符号,结果只能是true和false

逻辑运算符:用于连接两个Boolean类型的判断表达式。

&:与符号。
*/

int e=7;

//System.out.println(2<e&10>e);

/*

Boolean表达式的结果只能是true或false &与符号用于连接两边表达式的正确性再进行判断

上面我们定义的e为7 2<7 同时 10>7 两边表达式的结果都为true 所以它的结果也是true。

&与符号的运算特点:

true & true = true;

true & false = false;

false & true = false;

false & false = false;

说明在&与运算中,只有两边表达式为true 结果才能为true,否则都为false。

|:或运算符的特点:

true | true = true;

false | true = true;

true | false = true;

false | false = false;

说明在|或运算符中,只有两边都为false时结果才为false,其余都是true。

^异或运算符特点:

true ^ true = false;

false ^ true = true;

true ^ false = true;

false ^ false = false;

和|的唯一区别是两边为true时,结果为false。其余和|或运算符的结果全部一样。

意思说两边结果相同时为false,不同时为true。

! 非运算符,判断事物的另一面。

!true = false;
非真就是假

!false = true;
非假就是真

&& 双与

和&与的运算结果一样,只是过程有区别。

&是无论左边的运算结果是什么,右边都参与运算。

&&是只要左边为false,右边不参与运算,即短路。

|| 双或

和|的运算结果一样,过程有区别。

|是无论左边的运算结果是什么,右边都参与运算。

||是只要左边为true,右边不参与运算,即短路。

&和&&的区别 |和||的区别很可能是面试题,一定要重点掌握。

位运算符:用于二进制位运算的符号。

&运算符 &不仅是逻辑运算符,同时也是位运算符。

比如 6&3 它的结果应该是这么来的

位运算是二进制运算,所以得把两个数转换成二进制数再进行运算

为了方便,这里不再将两个数的32位全部写出来,只保留有效位即可。

6的二进制数为 0110 3的二进制数为 0011

在二进制中 0就是false 1就是true 所以

0110

&0011

0010 二进制转换过来是2 它的结果就是2

&运算的判断结果参考&作为逻辑运算符是的判断方法。两个为true才为true,也就是1.

|运算符:和&一样,同是逻辑运算符,也是位运算符

比如 6|3 算法与上面同理,判断结果也是根据|作为逻辑运算符时的结果。

0110

|0011

0111 转换过后是7 所以结果是7

^异或运算符

6^3 ^异或的特点就是两边相同为false,不同为true。

0110

^0011

0101 转换过来是5

^异或有个特点:

一个数被同一个数异或两次后得到的还是原数。这个特点可以用于数据加密。

总结:&与运算 |或运算 ^异或运算 这三种运算方法,有一个共同的特点。

那就是相运算的两个数位置即使互换,结果还是一样。

~反码,数值取反。

整数的负数二进制表现形式为取反再加1

这里就只是取反 未加1 所以一个整数取反的数就是他的负数再减1.

~8 的反码是 -9 ~7的反码是-8 就是这样

反码不常用,几乎不用。

<< 左移运算符

3<<2

首先还是转换为二进制,这里涉及到移位,为方便理解,把全部字节都写出来

0000-0000 0000-0000 0000-0000 0000-0011

左移两位就是将整个数值的字节往左移动两个数值并舍弃 后面空出来的两个数值位用0弥补。

得到的结果就是:

0000-0000 0000-0000 0000-0000 0000-1100

也就是12

由此我们可以看出 一个数左移一位得到的数就会是原数的2倍,也就是乘以2.再移动一位就再乘以2.

一个数左移几位其实就是该数乘以2的几次方。

>>右移运算符。和左移差不多。

需要注意的是,右移时,原数最高为是0就拿0补位,是1就用1补位。

同样我们可以看出特点 右移几位其实就是该数除以2的几次方、

例如:8>>2 得到的结果2.

>>>无符号右移 和右移原理是完全相同的

区别在于 无符号右移时,不管原数最高位是什么,都拿0去补位。

练习,将两个变量的值进行互换。

通常情况下,我们应该建立一个临时的第三方变量来进行存储,然后再互换前两个变量。

*/

int f=3,g=6;

/*int h;

h=f;//这里h等于3

f=g;//这里f等于6

g=h;//这里g等于3

//再提一个要求,再不允许使用第三方变量的情况下,我们应该怎么互换?

//我们可以用两者的和来进行运算。

f=f+g;//这里f=3+6

g=f-g;//g=3+6-6;g=3;

f=f-g;//f=3+6-3;f=6;

不过这种方式不建议用,因为如果两数过大,超出数据类型范围的话,容易强制转换,数据丢失。

我们知道一个数异或同一个数两次还能得到原数,所以这里我们可以用异或来解决问题。

*/

f=f^g;//这里f的值开始变化。

g=f^g;//3^6^6=3;g=3;

f=f^g;//3^6^3=6;f=6;

/*不过这种方式阅读性很差,一般面试才会用。

开发时一般还是用第三方变量方式比较多,阅读性强,好理解。

三元运算符: (条件表达式)?表达式1:表达式2;

如果条件表达式结果为true,则运算表达式1;

如果条件表达式结果为false,则运算表达式2;

例如:*/

int h=5,y;

y=(h<3)?200:400;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: