运算符

逻辑运算符
&(与)两边为true则为true,否则false
|(或)任意一边为true则为true
^(异或)两边不同则为true,两边相同则为false
!(非)原先为true则为false,原先为false则为true
&&(双与)两边为true则为true,否则false
||(双或)任意一边为true则为true

&&和&的区别:
短路问题:
&&先执行左边,如果根据左边就可以得出结论的话就不会执

行右边的操作和判断,直接输出判断结果。&会坚持将两边都

走完。
||和|也是这样的区别

举例子:
package test;

public class Test3 {
    public static void main(String[] args){
        int a=10;
        int b=20;
        int c=10;
        int d=20;        
        boolean flag=((a=a+1)>50)&&((b=b+1)

>50);
        boolean flag1=((c=c+1)>50)&((d=d+1)

>50);
        System.out.println("a="+a+" b="+b

+" c="+c+" d="+d);
    }

}
得到的a=11,b=20,c=11,d=21

^(异或):
两边相同则为false两边不同则为true
!(非):
针对一个元素,为true为变成false,为false则变成true

位运算符
对二进制进行运算

package test;

public class Test4 {
    public static void main(String[] args){
        /**
         求3位与,位或,位异或4的结果
         求~3的结果(按位取反)
         注意:二进制的运算都是针对补码进行操

作的
        
        正数的原反补都是一样
        0代表false,1代表true,就是和逻辑运算

符的与或非异或差不多了
        
    3:    00000000    00000000    

00000000    00000011
    4:    00000000    00000000    

00000000    00000100
    
    
 3&4:
         00000000    00000000    

00000000    00000000    转成十进制得到 0
 3|4:
         00000000    00000000    

00000000    00000111    转成十进制得到7
 3^4:    
         00000000    00000000    

00000000    00000111    转成十进制得到7
 ~3:    
 补码:        11111111    11111111    

11111111    11111100
 反码:        11111111    11111111    

11111111    11111011
 原码:        10000000    00000000    

00000000    00000100    得到-4
 
             
 再写一个例子:
     3&-4
      3:    
              00000000    00000000    

00000000    00000011
      -4:
      原:    10000000    00000000    

00000000    00000100
      反:    11111111    11111111    

11111111    11111011
      补:    11111111    11111111    

11111111    11111100
     
 得到:
     补:        00000000    00000000    

00000000    00000000    得到:0
         
         
     ^位异或的特点:
         a对b进行了异或操作两次相当于没有进行

对b的异或操作。
     以3^4^4为例子:
     3:    00000000    00000000    

00000000    00000011
    4:    00000000    00000000    

00000000    00000100
第一次: 00000000        00000000    

00000000    00000111
    4:    00000000    00000000    

00000000    00000100
第二次: 00000000        00000000    

00000000    00000011
可以发现,对同一个变量位异或2次就相当于没有异或
      
         */
    
        System.out.println(3|4);
        System.out.println(3^4);
        System.out.println(~3);
        System.out.println(3&(-4));
    }
    

}


package test;

public class Test5 {
    public static void main(String[] args){
        /**
         * 根据>尖判断左移还是右移
         * 〉〉右移, 判断正负,正数的话,右移,空位补0;负数的话,右移,空位补1
         * << 左移 ,空位补0,被移除的最高位丢弃    
         * >>>无符号右移     右移,空位补0
         *
         * 针对正数的一些规律:
         * a>>b相当于a/(2^b)   3>>2=3/4=0
         * a>>>b和上面一样
         * a<<b相当于a*2^n   3<<2=3*2^2=12
         */
        
        
        int a=3<<2;
        int b=3>>2;
        int c=3>>>2;   //3*2^2=12
        int d=-3>>2;
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
        /*
         3
         原反补:    00000000000000000000000000000011
          00    00000000000000000000000000001100    得到:8+4=12
          
         原反补:    00000000000000000000000000000011
                 00000000000000000000000000000000  11 得到:0;
                 
                 00000000000000000000000000000011  原
                 11111111111111111111111111111100 反
                 
                 11111111111111111111111111111101 补
                 11111111111111111111111111111111  01补
                 11111111111111111111111111111110  反
                 10000000000000000000000000000001 原   得到:-1    
        
         */
    }

}

原文地址:https://www.cnblogs.com/aigeileshei/p/5516869.html