java运算符(常见^ 、|、&、>>、<<、>>>)

  • Post author:
  • Post category:java
检查是否是某个类的对象    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 版权协议,转载请附上原文出处链接和本声明。