逻辑运算符

  • &-----逻辑与 | ----- 逻辑或 ! ----- 逻辑非
  • &&-----短路与 || ----- 断路或 ^ ----- 逻辑异或

a

b

a & b

a && b

a | b

a || b

!a

a ^ b

true

true

true

true

true

true

false

false

true

false

false

false

true

true

false

true

false

true

false

false

true

true

true

true

false

false

false

false

false

false

true

false

  • 区分 &&&
  • 相同点1:&&& 的运算结果相同
  • 相同点2:当符号左边是true时,二者都会执行符号右边的运算
  • 不同点:当符号左边是false时,&继续执行符号右边的运算。而&&不再执行符号右边的
  • 区分 |||
  • 相同点1:||| 的结果相同
  • 形同点2:当符号左边是false时,二者都会执行后面的操作
  • 不同点:当符号左边时true时,|继续执行符号右边的运算,而 ||不在执行符号右边的操作

位运算符

位运算符操作的都是整型的数据。

位运算符是直接对整数的二进制进行计算。

运算符

运算

范例

<<

左移

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

  • 注意:没有<<<无符号左移

位运算符的细节

<<

空位补0,被移除的高位丢弃,空缺位补0。

>>

被移位的二进制最高位是0,右移后,空缺位补0;最高位如果是1,则空缺位补1。

>>>

被移位二进制最高位无论是0或者是1,空缺位都补0。

&

二进制位进行&运算,只有1 & 1时结果是1,否则是0。

|

二进制位进行|运算,只有0|0时结果是0,否则是1。

^

相同二进制位进行^运算,结果是0;( 1 ^ 1 = 0, 0 ^ 0 = 0 )

不相同二进制位^运算结果是1。( 1 ^ 0 = 1, 0 ^ 1 = 1 )

~

正数取反,各二进制码按补码各位取反

负数取反,各二进制码按补码各位取反

<< :在一定范围内,每项左移1位,相当于 * 2

>>: 在一定范围内,每项右移1位,相当于 / 2

public class BitTest {
    public static void main(String[] args) {
        int i = 21;
        int j = -21;
        System.out.println(" j << 2 = " + ( j << 2 ));  // -21 * 2 * 2 = -84
        System.out.println(" i << 2 = " + ( i << 2 ));  // 21 * 2 * 2 = 84
        System.out.println(" i << 3 = " + ( i << 3 ));  // 21 * 2 * 2 * 2 = 168

        System.out.println(" j >> 2 = " + ( j >> 2 ));  // -21 / 2 / 2 = -6
        System.out.println(" i >> 2 = " + ( i >> 2 ));  // 21 / 2 / 2 = 5
        System.out.println(" i >> 3 = " + ( i >> 3 ));  // 21 / 2 / 2 / 2 = 2

        int m = 12;
        int n = 5;
        System.out.println(" m & n = " + ( m & n ));    // 4
        System.out.println(" m | n = " + ( m | n ));    // 13
        System.out.println(" m ^ n = " + ( m ^ n ));    // 9
    }
}

数值之间的交换:

//  交换两个变量的值
        int num1 = 10;
        int num2 = 20;
        System.out.println(" num1 = " + num1 + " ,num2 = " + num2);

        //  方法一:推荐以定义临时变量的方式进行交换
        //  好处:适用于多种类型
        int temp = num1;
        num1 = num2;
        num2 = temp;
        System.out.println(" num1 = " + num1 + " ,num2 = " + num2);

        // 方法二:
        // 好处:不用定义临时变量
        // 弊端:①相加操作可能超出存储范围②有局限性:只针对数值类型
        int num3 = 10;
        int num4 = 20;
        num3 = num3 + num4; // num3 = 30;
        num4 = num3 - num4; // num4 = 10;
        num3 = num3 - num4; // num3 = 20;

        System.out.println(" num3 = " + num3 + " ,num4 = " + num4);

        // 方法三:实用位运算符
        // 好处:不用定义临时变量
        // 弊端:有局限性:只针对数值类型
        int num5 = 10;
        int num6 = 20;
        num5 = num5 ^ num6;
        num6 = num5 ^ num6;
        num5 = num5 ^ num6;
        System.out.println(" num5 = " + num5 + " ,num6 = " + num6);