Java 运算符

算术运算符

关系运算符

位运算符

操作符 描述
如果相对应位都是1,则结果为1,否则为0
| 如果相对应位都是0,则结果为 0,否则为1
^ 如果相对应位值相同,则结果为0,否则为1
按位取反运算符翻转操作数的每一位,即0变成1,1变成0。
<< 按位左移运算符。左操作数按位左移右操作数指定的位数。
>> 按位右移运算符。左操作数按位右移右操作数指定的位数。
>>> 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。

例:

public class Test {
    public static void main(String[] args) {
        int a = 20;int b = -20; int s = 15; 
        /*	a = 20 = 0001 0100	如果相对应位都是1,则结果为1,否则为0
          	s = 15 = 0000 1111
          	a & s  = 0000 0100 = 4 */ 
        System.out.println("a & s = " + (a & s) );
        /* 	b = -20 = 1110 1100		负数二进制有 负数的绝对值的反码,再补码 20 = 0001 0100
            s = 15  = 0000 1111					 上面的0变1,1变0  反码      1110 1011	
         	b & s   = 0000 1100 = 12 			  上面的二进制+1	 补码	 	1110 1100 */ 
        System.out.println("b & s = " + (b & s) );
        /*	a = 20 = 0001 0100	如果相对应位都是 0,则结果为 0,否则为 1
            s = 15 = 0000 1111
         	a & s  = 0001 1111 = 31 */ 
        System.out.println("a | s = " + (a | s) );
		/*	b = -20 = 1110 1100	
             s = 15  = 0000 1111
         	 a & s =  1110 1111 = -17 	补码前:1110 1110 反码前:0001 0001 = 17 */ 
        System.out.println("a | s = " + (b | s) );
        /*  a = 20 = 0001 0100	如果相对应位值相同,则结果为0,否则为1
            s = 15 = 0000 1111
         	a & s =  0001 1011 = 27 */
        System.out.println("a ^ s = " + (a ^ s) );
        /*	b = -20 = 1110 1100	
            s = 15  = 0000 1111
         	a & s  =  1110 0011 = -29 	补码前:1110 0010 反码前:0001 1101 = 29 */
        System.out.println("b ^ s = " + (b ^ s) );
        /*	a = 20 = 0001 0100	按位取反运算符翻转操作数的每一位,即0变成1,1变成0。	即反码
            	^a = 1110 1011 =  -21	补码前:1110 1010 反码前:0001 0101 = 21 */
        System.out.println(" ~a = " + (~a) );
		/*	b = -20 = 1110 1100
            	 ^b  = 0001 0011 =  19 */
        System.out.println(" ~b = " + (~b) );
        /*	a = 20 = 0001 0100	按位左移运算符。左操作数按位左移右操作数指定的位数。
        	a << 2 = 0101 0000 = 80	*/
        System.out.println("a << 2 = " + (a << 2) );
        /*	b = -20 = 1110 1100
        	b << 2  = 1011 0000 = -80	补码前:1010 1111 反码前:0101 0000 = 80 */
        System.out.println("b << 2 = " + (b << 2) );
        /*	a = 20 = 0001 0100	按位右移运算符。左操作数按位右移右操作数指定的位数。
        	a >> 2 = 0000 0101 = 5	*/
        System.out.println("a >> 2 = " + (a >> 2) );
        /*	b = -20 = 1110 1100
        	b >> 2  = 1111 1011 = -5	补码前:1111 1010 反码前:0000 0101 = 5 */
        System.out.println("b >> 2 = " + (b >> 2) );
        /*	按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。
        	a =  20 = 0001 0100
        	a >>> 2 = 0000 0101 = 5	*/
        System.out.println("a >>> 2 = " + (a >>> 2) );
        /*	b = -20  = 1111 1111 1111 1111 1111 1111 1110 1100		(32位)
        	b >>> 2  = 0011 1111 1111 1111 1111 1111 1111 1011 = 1073741819
        	在这里存储二进制的int类型是32位,32位的0,1表示该数是正是负
        	所以这里 b>>>2 等同于	int类型的最大值 - 2^30 - 2^2	(二进制是从2^0开始的)
        	System.out.println(Integer.MAX_VALUE - (int) Math.pow(2,30) - (int) Math.pow(2,2));
         */
        System.out.println("b >> 2 = " + (b >> 2) );
    }
} 

逻辑运算符

赋值运算符

三目运算符(?:)

Java运算符优先级

当多个运算符出现在一个表达式中,谁先谁后呢?这就涉及到运算符的优先级别的问题。在一个多运算符的表达式中,运算符优先级不同会导致最后得出的结果差别甚大。

下表中具有最高优先级的运算符在的表的最上面,最低优先级的在表的底部。

(我觉得不用咋记,用着,每次测试运行下,久了都习惯了,大部分顺序就和数学计算差不多)

类别 操作符 关联性
后缀 () [] . (点操作符) 左到右
一元 expr++ expr-- 从左到右
一元 ++expr --expr + - ~ ! 从右到左
乘、除、取余 * / % 左到右
加、减 + - 左到右
移位 >> >>> << 左到右
判断 > >= < <= == != 左到右
按位与 左到右
按位异或 ^ 左到右
按位或 | 左到右
逻辑与 && 左到右
逻辑或 | | 左到右
条件 ?: 从右到左
赋值 = + = - = * = / =%= >> = << =&= ^ = | = 从右到左
逗号 左到右
posted @ 2021-06-10 11:39  我豪  阅读(70)  评论(0)    收藏  举报