检查是否是某个类的对象 instanceof
public class DemoTest {
public static void main(String[] args) {
String str = "hello";
Object o = new Object();
if (str instanceof String) {
System.out.println("字符串");
}
if (o instanceof Object) {
System.out.println("对象");
}
}
}
亦或符号 ^
特点:
1. 亦或结果相同则为false,亦或结果不同则为true
2. 当一个数据被另一个数据^两次,得到的数据依然是之前的数据
演示特点1:
public class DemoTest {
public static void main(String[] args) {
// false
boolean a = true ^ true ;
// true
boolean b = true ^ false ;
// true
boolean c = false ^ true ;
// false
boolean d = false ^ false ;
}
}
演示特点2
public class DemoTest {
public static void main(String[] args) {
int a = 123, b = 456;
a = a ^ b;
b = b ^ a;
a = a ^ b;
// 456
System.out.println(a);
// 123
System.out.println(b);
}
}
位运算符 (位运算,就是二进制位/比特位 的运算。其实就是二进制的运算)
<< 左移 3<<2 = 12 --> 3 * 2 * 2 = 12
>> 右移 3>>1 = 1 --> 3/2 = 1
>>> 无符号右移 3>>>1 = 1 --> 3/2 = 1
& 与运算 6 & 3 = 2
| 或运算 6 | 3 = 7
^ 亦或运算 6 ^ 3 = 5
~ 反码 ~6 = -7
<< 左移运算符:
3 << 2
0000-0000 0000-0000 0000-0000 0000-0011 3的二进制
----------------------------------------------------------
0000-0000 0000-0000 0000-0000 0000-1100 把实际数据向左移2位,转为10进制为12
所以: 3 << 2 = 12 ,口算方法: 3 * 2 * 2 = 12
例如: 1 << 3 = 8 ,口算方法: 1 * 2 * 2 * 2 = 8
>> 右移运算符:
负数右移高位无论如何都是1
3 >> 1
0000-0000 0000-0000 0000-0000 0000-0011 3的二进制
----------------------------------------------------------
0000-0000 0000-0000 0000-0000 0000-0001 转十进制后为1
所以: 3 >> 1 = 1 ,口算方法: 3 / 2 = 1 余数为1
例如: 3 >> 2 = 0 ,口算方法: 3 / 2 / 2 余数为0
具体示例:
32>>1 = 16
0000-0000 0000-0000 0000-0000 0010-0000
0000-0000 0000-0000 0000-0000 0001-0000
32>>>1 = 16
0000-0000 0000-0000 0000-0000 0010-0000
0000-0000 0000-0000 0000-0000 0001-0000
-32>>1 = -16
1111-1111 1111-1111 1111-1111 1110-0000
1111-1111 1111-1111 1111-1111 1111-0000
-32>>>1 = 2147483632
1111-1111 1111-1111 1111-1111 1110-0000
0111-1111 1111-1111 1111-1111 1111-0000
>>> 无符号右移运算符: >>> 与 >> 两个运算符计算方式一样,但有一点区别:
唯一的区别:
无符号右移,数据右移时,二进制最高位出现的空位,无论原高位是什么,空位都用0补位;
也就说:数据一定为正。
注意:0相当于false ,1相当于true
// 相当于java中
if (true & false) {
}
&运算特点,在&运算中:1&1=1,1&0=0,0&0=0
6 & 3 与运算: (与运算特点:有一个false则为false)
0000-0000 0000-0000 0000-0000 0000-0110 6的二进制
& 0000-0000 0000-0000 0000-0000 0000-0011 3的二进制
-----------------------------------------------------------
0000-0000 0000-0000 0000-0000 0000-0010 转为十进制为2
所以: 6 & 3 = 2
HashMap的源码里有个计算: (n - 1) & hash,其实刚初始化的时候计算结果无论如何都在16以内。
6 | 3 或运算: (或运算特点:有一个true则为true 记忆:或,有真就行。)
0000-0000 0000-0000 0000-0000 0000-0110 6的二进制
| 0000-0000 0000-0000 0000-0000 0000-0011 3的二进制
-----------------------------------------------------------
0000-0000 0000-0000 0000-0000 0000-0111 转为十进制为7
所以: 6 | 3 = 7
^运算特点,在^运算中:1^1=0,0^0=0,1^0=1,0^1=1 (总结:相等为0,不等为1)
6 ^ 3 亦或运算:(亦或运算特点:两边相同false,两边不同为true 记忆:亦或,有真就行,但是全真不行)
0000-0000 0000-0000 0000-0000 0000-0110 6的二进制
^ 0000-0000 0000-0000 0000-0000 0000-0011 3的二进制
-----------------------------------------------------------
0000-0000 0000-0000 0000-0000 0000-0101 转为十进制为5
^ 0000-0000 0000-0000 0000-0000 0000-0011 3的二进制 (再亦或同一个数)
-----------------------------------------------------------
0000-0000 0000-0000 0000-0000 0000-0110 转为十进制为6
所以: 6 ^ 3 = 5 5 ^ 3 = 6 (亦或的特点:同时亦或一个相同的数据两次,结果还是这个数)
~6 反码运算:
0000-0000 0000-0000 0000-0000 0000-0110 6的二进制
~
-----------------------------------------------------------
1111-1111 1111-1111 1111-1111 1111-1001 转为十进制为-7
简单运算方法:-6-1 = -7 (其实就是:取该值得负数减1)
~-7 反码运算
1111-1111 1111-1111 1111-1111 1111-1001 -7的二进制
~
-----------------------------------------------------------
0000-0000 0000-0000 0000-0000 0000-0110 转为十进制为6
结果: 取-7的负数减1 (--7-1 = 7-1 = 6)
= += -= *= %=
注意:
这里的byte取值范围为 -128~127,所以127+4如果还是byte类型,就开始循环运算。
127+1 = -128
-128+3 = -125
public class TestOne {
public static void main(String[] args) {
byte s = 127;
s += 4; // 自动强转 s = (byte)(s + 4);
// s = s + 4; // 编译报错,因为4为int类型,如果还用低级别类型接收数据,就必须强转
System.out.println(s); // -125
}
}
其他同理
++ (自增:就是在原有数据的基础上+1) -- (自减:原因同上)
不过 ++/-- 放在运算的数据前后,运算过程是不一样的
public class TestOne {
public static void main(String[] args) {
int s = 3;
// 3 + 5 + 5
//s = s++ + ++s + s++; // 最后面的s++的++不做计算,只是赋值
//System.out.println(s);
System.out.println(s++); //3
System.out.println(++s); //5
System.out.println(s++); //5
int a = 3,b;
b= a++;
System.out.println(b+","+a); // 3,4
//a++; // 相当于 a = a + 1
//int c = 5++; // 编译报错,应该是编译后为: 5 = 5 + 1; 所以报错
}
}
总结:
s++ 运算过程是: 先给s变量赋值,再完成相加运算 (所以s++ 得到的是最开始赋值的数据,运算相加后等于4)
++s 运算过程是: 先运算完成相加,在给s变量赋值 (所以++s 就相当于++4等于5,然后赋值给s)
基础运算符
public class DemoTest {
public static void main(String[] args) {
// 5+5=55
System.out.println("5+5=" + 5 + 5);
// a+b=55
System.out.println("a+b=" + 5 + 5);
// 字符串相加
}
}
版权声明:本文为chuxin_mm原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。