Java中的运算符总结 —— 逻辑运算符、位运算符、移位运算符

1. 逻辑运算符

逻辑运算符主要有三个: && 、|| 、 !
逻辑运算符的返回值和操作数都是boolean类型。

1.1 逻辑与 &&

&& 中两个操作数都为 true,结果才为 true,否则为 false。 其中 & 的操作数为 boolean 类型时也可以表示逻辑运算。

public static void main(String[] args) {
        int a = 10, b = 20, c = 30;
        System.out.println("&&的结果:"+ (a < b && b < c));
        System.out.println("&&的结果:"+ (c < a && a < b));
        System.out.println("&的结果:"+ (c < a & a < b));
    }

在这里插入图片描述

注意:&& 遵守短路求值,也就是只要第一个操作数为 false,就直接返回 false,不再求第二个操作数。而 & 则不遵守短路求值。
证明:

System.out.println("&&的结果:" + (c < a && 4 / 0 == 0));
System.out.println("&的结果:" + (c < a & 4 / 0 == 0));

第一行代码没有报错是因为它只求了第一个表达式结果是 false ,然后直接就返回了 false ,而没有进行下一个表达式,所以除数为0 时也没有报错。而使用 & 时,不会短路求值,两个操作数都求值了,所以出现了除数为0的异常。一般不会使用&,推荐使用&&。
在这里插入图片描述

1.2 逻辑或 ||

|| 中两个操作数都为 false,结果为 false,否则为 true。也就是只要有一个 true,结果就为 true。

        int a = 10, b = 20, c = 30;
        System.out.println("||的结果:" + (a < b || b < c));
        System.out.println("||的结果:" + (c < a || b < a));
        System.out.println("||的结果:" + (c < b || a < b));
        System.out.println("|的结果:" + (c < b || a < b));

在这里插入图片描述
注意:同 && 逻辑与一样,|| 也遵守短路求值,如果第一个表达式结果为true,整体结果就为true,不用再计算第二个表达式。而 | 不遵守短路求值。

1.3 逻辑非 !

逻辑非为单目运算符,只有一个操作数。操作数为 true,结果为 false ;操作数为 false,结果为 true。

        int a = 10, b = 20;
        System.out.println(a < b);
        System.out.println(!(a < b));

在这里插入图片描述

2. 位运算符

位运算符主要有四个:& | ~ ^
Java中对数据操作的最小单位是二进制,位操作表示按二进制位运算,就是按照二进制位的每一位依次进行计算。

2.1 按位与 &

如果两个二进制位都是1,则结果为1,否则为0。

public static void main(String[] args) {
        int a = 10, b = 20;
        System.out.println(a & b);
    }

结果为:0
在这里插入图片描述

2.2 按位或 |

如果两个二进制位都是0,则结果为0,否则为1。

        int a = 10, b = 20;
        System.out.println(a | b);

结果为:30
在这里插入图片描述

2.3 按位取反 ~

按位取反不单单是0变1,而是必须知道该二进制的补码,这样才能给其按位取反。因为在内存中二进制数是以补码的形式存放的,而正数、负数的补码是不一样的。正数的补码、反码都是其本身;负数的反码是在原码的基础上符号位不变,其它各位求反,补码是反码末位加1.
举例:
9:
原码:0000 1001
反码:0000 1001
补码:0000 1001

-3:
原码:1000 0011(最高位是符号位)
反码:1111 1100(最高位不变,其他为取反)
补码:1111 1101(最后一位加1)

对9按位取反步骤:

  1. 先得到9的补码,然后对其取反为: 1111 0110
  2. 再将取反后的补码1111 0110转为原码,先减1,再取反:1000 1010
  3. 最终结果:1000 1010 转换为十进制就是-10.

对-3按位取反步骤:

  1. 先得到-3的补码取反:0000 0010
  2. 0000 0010是个正数,它的原码、补码、反码一样为0000 0010
  3. 最终结果:0000 0010 转换为十进制就是2.

在这里插入图片描述

总结:
按位取反步骤是:先得到该数的补码,对其补码取反,然后将其补码转为原码,按照要求的进制输出。
规律:

  1. 所有正整数的按位取反是其本身加1的负数;
  2. 所有负整数的按位取反是其本身加1的绝对值;
  3. 零的按位取反是-1.

2.4 按位异或 ^

如果两个数字的二进制位上的0(或1)相同,则结果为0;如果不同,则结果为1.

        int a = 10;
        int b = 20;
        System.out.println(a ^ b);

结果:30
在这里插入图片描述

3. 移位运算符

移位运算符有三个:<< >> >>>
左移 << : 最左侧位不要,最右侧位补0。
右移 >> : 最右侧位不要,最左侧位补符号位(正数补0,负数补1)。
无符号右移 >>> : 最右侧位不要了,最左侧位补0。

用法:

  1. 左移1位相当于原数字 * 2,左移 n 位相当于原数字 * 2的 n 次方;
  2. 右移1位相当于原数字 / 2,右移 n 位相当于原数字 / 2的 n 次方;
  3. 计算机中移位效率高于计算乘除,为了提高算法效率,代码中乘除2的 n 次方时可以用移位代替。

4. 位运算的应用

1. 位1的个数
2. 2的幂
3. 只出现一次的数字

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值