1. 运算符
1.1 赋值运算
= += -= *= /= %=
byte x=1;
x+=2;
x==3;
如果
byte x=1;
x=x+2;
无法成功运行;
这是因为整型1在栈内存的常量池中以二进制形式存储,0 0000001;
2以默认的int类型在常量池中也以二进制形式存储,00000000 00000000 00000000 00000010;
在执行x+=2时,加法运算符会将二进制形式存储的1自动补齐,
0000000 00000000 00000000 00000001 + 00000000 00000000 00000000 00000010
==00000000 00000000 00000000 00000011;
赋值运算符会自动进行取舍,即 00000011(因为前面都是 0);
而 x=x+2,右边的 x+2 加法运算符无法准确地判断,32bit无法存储在8bit的byte类型中;
1.2 位运算
位运算的操作对象是二进制;包含 | 按位或 & (按位与)、^ (按位异)、 ~ ( 按位取反)这几个运算,
在讲之前,先了解一下十进制,二进制:
十进制:逢十进一,例如我们现在的数学采用的就是十进制;
二进制:逢二进一,由0和1组成(后面是有效位);
十进制转换成二进制:除二取余,倒序排列;
二进制转十进制: 从右到左计算,每个数乘2的位置次幂(从0开始算),结果累加;
讲完了二进制,十进制,再补充
八进制,十六进制;
二进制:01, 不超过2;
十进制:0123456789, 不超过10;
八进制:01234567, 不超过8;
十六进制:0123456789ABCDE, 不超过16;
位运算规则
1.十进制转换为二进制;
2,竖着按照对应位置进行位运算(true——1,false——0);
3.二进制转换为十进制
如 3 & 5
第一步:3的二进制 00000011
5的二进制 00000101
第二步:按位符&: 00000001
第三步:十进制: 1
即 3 & 5=1;
(4)原码,反码,补码
正数的原码,反码,补码均相同:
负数的原码,反码,补码相比较麻烦;
举例: 6 -6
原码:00000000 00000000 00000000 00000110 10000000 00000000 00000000 00000110 反码:00000000 00000000 00000000 00000110 11111111 11111111 11111111 11111001 补码:00000000 00000000 00000000 00000110 11111111 11111111 11111111 11111010
负数的反码是除符号位外,全部取反,补码则是反码加一;
计算机是以补码的形式存储数字的(与二进制存储不矛盾) ,不管正.负;
反码是一种形式,取反是一个过程;
(5)6<<1
第一步:十进制 00000000 00000000 00000000 00000110
第二步:移动: 00000000 00000000 00000000 00000110
第三步: 000000000 00000000 00000000 00001100(左边第一个“挤”掉了,最右边空的用0补上)
000000000 00000000 00000000 00001100的十进制是:12
即 6<<1=12,相当于6*2的位移次幂;
1.3 逻辑运算
boolean:true false
java不同于C/C++,判断对错只能用 true或者false;
如 3>2,结果为 true;
非与或(! & |) &&(短路与) ||(短路或) ^(异或)
逻辑与(&)VS 短路与(&&)
只有当 短路与 中第一个判断条件为 false 的时候才会发生短路,即后面的条件不判断了,此时性能比 逻辑与 好一些,如果不发生短路,两者没有区别;
短路或(||) 与 逻辑或(|) 在结果上没有区别;
1.4 关系运算符
== != > < >= <=
区分”==“与”=“运算符:
”==“类似于数学中的”=“号;
”=“是赋值运算符,给变量赋值的;
善于总结,将知识点转化为自己的语言进行输出,效果才会更好;