java基础-操作符

1.算数操作符:

+(加)   -(减)   *(乘)   /(除于)

public class HelloWorld {
    public static void main(String[] args) {
        int i = 10;
        int j = 5;
        int a = i + j;
        int b = i - j;
        int c = i * j;
        int d = i / j;
    }
}

%(取模)

取余数,又叫取模

public class HelloWorld {
    public static void main(String[] args) {
        int i = 5;
        int j = 2;
        System.out.println(i % j); // 5除以2,余1,输出为1
    }
}

++(自增)   --(自减)

在原来的基础上增加1或者减少1

public class HelloWorld {
    public static void main(String[] args) {
        int i = 5;
        System.out.println(i++); // 输出5
        System.out.println(i); // 输出6

        int j = 5;
        System.out.println(++j); // 输出6
        System.out.println(j); // 输出6

        int m = 5;
        System.out.println(m--); // 输出5
        System.out.println(m); // 输出4

        int n = 5;
        System.out.println(--n); // 输出4
        System.out.println(n); // 输出4
    }
}
public class HelloWorld {
    public static void main(String[] args) {
        int i = 1;
        int j = ++i + i++ + ++i + ++i + i++;
        System.out.println(i);
        System.out.println(j);
        // 第一步: ++i=2,    i=2,j=2;
        // 第二步: i++=2,    j=4,i=3;
        // 第三步: ++i=4,    i=4,j=8;
        // 第四步: ++i=5,    i=5,j=13;
        // 第五步: i++=5,    j=18,i=6;
    }
}

2.关系操作符

比较两个变量之间的关系。

>(大于)  >=(大于或等于)  < (小于)  <=(小于或等于)  ==(是否相等)  !=(是否不等)

public class HelloWorld {
    public static void main(String[] args) {
        int a = 5;
        int b = 6;
        int c = 5;

        System.out.println(a > b); // 返回 false
        System.out.println(a >= c); // 返回 true

        System.out.println(a == b); // 返回false
        System.out.println(a != b);// 返回true
    }
}

3.逻辑运算符

&长路与 和 &&短路与

两边的运算单元都是布尔值,都为真时,才为真,任意为假,就为假;

长路与 两侧,都会被运算,短路与 只要第一个是false,第二个就不进行运算了。

public class HelloWorld {
    public static void main(String[] args) {
        // 长路与 无论第一个表达式的值是true或者false,第二个的值,都会被运算
        int i = 2;
        System.out.println(i == 1 & i++ == 2); // 无论如何i++都会被执行,所以i的值变成了3
        System.out.println(i);

        // 短路与 只要第一个表达式的值是false的,第二个表达式的值,就不需要进行运算了
        int j = 2;
        System.out.println(j == 1 && j++ == 2); // 因为j==1返回false,所以右边的j++就没有执行了,所以j的值,还是2
        System.out.println(j);
    }
}

|长路或 和 ||短路或

两边的运算单元都是布尔值,都为假时,才为假,任意为真,就为真;

长路或 两侧都会被运算,短路或 只要第一个是true的,第二个就不进行运算了。

public class HelloWorld {
    public static void main(String[] args) {
        // 长路或 无论第一个表达式的值是true或者false,第二个的值,都会被运算
        int i = 2;
        System.out.println(i == 1 | i++ == 2); // 无论如何i++都会被执行,所以i的值变成了3
        System.out.println(i);

        // 短路或 只要第一个表达式的值是true的,第二个表达式的值,就不需要进行运算了
        int j = 2;
        System.out.println(j == 2 || j++ == 2); // 因为j==2返回true,所以右边的j++就没有执行了,所以j的值,还是2
        System.out.println(j);
    }
}

!取反

真变为假;假变为真

public class HelloWorld {
    public static void main(String[] args) {
        boolean b = true;

        System.out.println(b); // 输出true
        System.out.println(!b);// 输出false
    }
}

^异或

不同,返回真;相同,返回假

public class HelloWorld {
    public static void main(String[] args) {
        boolean a = true;
        boolean b = false;

        System.out.println(a ^ b); // 不同返回真
        System.out.println(a ^ !b); // 相同返回假
    }
}
public class HelloWorld {
    public static void main(String[] args) {
        int a = 4, b = 5;

        System.out.printf("交换前:a = %d, b = %d\n", a, b);
        a = a ^ b;
        b = a ^ b;
        a = a ^ b;
        System.out.printf("交换后:a = %d, b = %d\n", a, b);
    }
}
public class HelloWorld {
    public static void main(String[] args) {
        int i = 1;
        boolean b = !(i++ == 3) ^ (i++ == 2) && (i++ == 3);
        System.out.println(b);
        System.out.println(i);
        // 开始 i = 1;
        // !(i ++ == 3) 结果为true,i = 2
        // (i ++ == 2)结果为true,i = 3
        // 此时 !(i ++ == 3) ^ (i ++ == 2) 结果为 false
        // 再执行短与操作,整个表达式结果为 false
        // 注意:(i ++ == 3)表达式未执行
    }
}

4.位操作符

一个整数的二进制表达

public class HelloWorld {
    public static void main(String[] args) {
        int i = 5;
        String b = (Integer.toBinaryString(i)); // 5的二进制的表达101
        System.out.println(i + " 的二进制表达是: " + b);
    }
}

|位或

有1,则为1

public class HelloWorld {
    public static void main(String[] args) {
        int i = 5;
        int j = 6;

        System.out.println(Integer.toBinaryString(i)); // 5的二进制是101

        System.out.println(Integer.toBinaryString(j)); // 6的二进制是110

        System.out.println(i | j); // 所以 5|6 对每一位进行或运算,得到 111->7
    }
}

&位与

全为1,则为1

public class HelloWorld {
    public static void main(String[] args) {
        int i = 5;
        int j = 6;

        System.out.println(Integer.toBinaryString(i)); // 5的二进制是101

        System.out.println(Integer.toBinaryString(j)); // 6的二进制是110

        System.out.println(i & j); // 所以 5&6 对每一位进行与运算,得到 100->4
    }
}

^异或

不同则为1

任何数和自己进行异或 都等于 0;任何数和0 进行异或 都等于自己

public class HelloWorld {
    public static void main(String[] args) {
        int i = 5;
        int j = 6;

        System.out.println(Integer.toBinaryString(i)); // 5的二进制是101
        System.out.println(Integer.toBinaryString(j)); // 6的二进制是110
        System.out.println(i ^ j); // 所以 5^6 对每一位进行或运算,得到 011->3

        System.out.println(i ^ 0);
        System.out.println(i ^ i);
    }
}

~取非

1变0;0变1

取反

public class HelloWorld {
    public static void main(String[] args) {
        byte i = 5;

        System.out.println(Integer.toBinaryString(i)); // 5的二进制是00000101

        System.out.println(~i); // 取非即为11111010,即为-6
    }
}

<<左移  >>右移

左移:根据一个整数的二进制表达,将其每一位都向左移动,最右边一位补0
右移:根据一个整数的二进制表达,将其每一位都向右移动

public class HelloWorld {
    public static void main(String[] args) {
        byte i = 6;

        System.out.println(Integer.toBinaryString(i));// 6的二进制是110

        System.out.println(i << 1);// 6向左移1位后,变成1100,对应的十进制是12

        System.out.println(i >> 1);// 6向右移1位后,变成11,对应的十进制是3
    }
}

>>>带符号右移与无符号右移

带符号右移 >>
对于正数, 带符号右移 >> 会把所有的位右移,并在最前面补0
对于负数, 带符号右移 >> 会把所有的位右移,并在最前面补1
无符号右移>>>
如果是一个负数,那么对应的二进制的第一位是1
无符号右移>>>会把第一位的1也向右移动,导致移动后,第一位变成0
这样就会使得负数在无符号右移后,得到一个正数

简单的说:
带符号右移 >> 移动后正的还是正的,负的还是负的,符号不变
无符号右移>>>移动后,变正的了

public class HelloWorld {
    public static void main(String[] args) {
        int i = -10;

        // -10的二进制是11111111111111111111111111110110
        // 第一位是1,即符号位,代表这是一个负数
        System.out.println(Integer.toBinaryString(i));

        // 对于正数, 带符号右移 >> 会把所有的位右移,并在最前面补0
        // 对于负数, 带符号右移 >> 会把所有的位右移,并在最前面补1

        // -10带符号右移1位,移动后前面补齐1
        // 得到11111111111111111111111111111011
        // 因为第一位是1,所以依然是一个负数,对应的十进制是-5
        int j = i >> 1;
        System.out.println(Integer.toBinaryString(j));
        System.out.println(j);

        // -10无符号向右移1位,符号位也会向右移,第一位就变成了0
        // 得到01111111111111111111111111111011,对应的十进制是2147483643
        int k = i >>> 1;
        System.out.println(Integer.toBinaryString(k));

        System.out.println(k);
    }
}

5.赋值操作

=  +=  -=  *=  /=  %=  &=  |=  ^=  <<=  >>=  >>>=

public class HelloWorld {
    public static void main(String[] args) {
        int i = 3;
        i += 2;
        System.out.println(i);

        int j = 3;
        j = j + 2;
        System.out.println(j);

        int k = 3;
        k += ++k;
        System.out.println(k);
    }
}

6.三元操作符

?:

表达式?值1:值2
如果表达式为真 返回值1;如果表达式为假 返回值2。

import java.util.Scanner;

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("今天是礼拜几?");
        Scanner sc = new Scanner(System.in);
        int x = sc.nextInt();
        String day = (x == 1) ? "礼拜一"
                : (x == 2 ? "礼拜二"
                        : (x == 3 ? "礼拜三"
                                : (x == 4 ? "礼拜四" : (x == 5 ? "礼拜五" : (x == 6 ? "礼拜六" : (x == 7 ? "礼拜天" : "输入错误!"))))));
        System.out.println("今天是:" + day);
    }
}

7.计算机算术原理

原码:一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。

反码:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。 取反操作指:原为1,得0;原为0,得1。(1变0; 0变1) 

补码:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.。

5的二进制为 0000 0101
(原码为0000 0101,反码为0000 0101,补码为0000 0101)

-5的二进制应该用补码表示,应该为1111 1011(取反加1)
(原码为1000 0101,反码为1111 1010,补码为1111 1011)

1.加法

  0000 0101  5

+  0000 0001  1

-------------------------

  0000 0110  6

2.减法

  0000 0001  1

-   0000 0101  5

-------------------------

  1111 1100  -4(无符号4(0000 0100)->取反(1111 1011)->加一(1111 1100))

3.乘法

对负数进行左移:符号位始终为1,其他位左移

对正数进行左移:所有位左移,即 <<,可能会变成负数

对负数进行右移:取绝对值,然后右移,再取相反数

对正数进行右移:所有位右移,即 >>

实际上,只要是乘以或除以一个整数,均可以用移位的方法得到结果,如:
  a=a*9
分析a*9可以拆分成a*(8+1)即a*8+a*1, 因此可以改为: a=(a<<3)+a
  a=a*7
分析a*7可以拆分成a*(8-1)即a*8-a*1, 因此可以改为: a=(a<<3)-a
  关于除法可以类推, 

public class HelloWorld {
    public static void main(String[] args) {
        int i = 18;
        int j = i * 9;// =i*8+i*1

        System.out.println(j);
        System.out.println((i << 3) + i);
    }
}

猜你喜欢

转载自www.cnblogs.com/antao/p/12819038.html