JAVA中运算符的详讲

JAVA中运算符的详讲

1. ^(异或运算符)
^是针对二进制的二目运算符。运算规则:两个二进制数值如果在同一位上相同,则结果中该位为0,否则为1,比如1011 & 0010 = 1001。

2. |(或运算符)
|是针对二进制的二目运算符。运算规则:两个二进制数值如果在同一位上至少有一个1,则结果中该位为1,否则为0,比如1011 & 0010 = 1011。

3. &(与运算符)
&是是针对二进制的二目运算符。需要注意的是&&是java中判断条件之间表示“和”的标识符,&是一个二目运算符,两个二进制数值如果在同一位上都是1,则结果中该位为1,否则为0,可以认为两个都是true(1),结果也为true(1),比如1011 & 0110 = 0010。

&还有一个比较重要的地方,也是面试中经常出现的问题,即该运算符可以计算余数。我们知道四则运算中速度最慢的就是除,而取余操作更加慢,因此可以通过&来快速的求两个数的余数,来看例子:

public ModTest{

    public static void main(String[] args){

        System.out.println(45 & 11);
        System.out.println(45 & 7);
    }
    /**result:3, 5*/
}
给定x, y两个数值,想求x与y的余数,只需要x & (y-1)即可,如上面例子所示,想求45和12(45和8)的余数,只要求45 & 11(45 & 7)。

以下三种运算符都是位运算符

>>x(常数): 向右移动x位(顶点在哪个方向就往哪个方向移动),如果该数是正数,则高位(最左边)补x个0,如果是负数,则最高位补x个1。

<<x(常数): 向左移动x位(顶点在哪个方向就往哪个方向移动),无论正负数低位(最右边)都补x个0。

<<<: 无该表示方式。

>>>x(常数): 表示无符号右移x位,所谓无符号是与>>x对比,该操作在移动后,无论正负数高位(最左边)都补0。

4. <<(左移运算符)
举例1:-20<<2
原码:10000000 00000000 00000000 00010100

反码: 11111111   11111111   11111111  11101011(符号位不变,其他位取反)

补码: 11111111   11111111   11111111  11101100(反码 + 1)

左移两位(最右边两位添0)

补码: 11111111   11111111   11111111  10110000

反码: 11111111   11111111   11111111  10101111(补码 – 1)

原码: 10000000 00000000 00000000 01010000(符号位不变,其他位取反)

结果:-80

举例2:20<<2
原码(反码,补码):00000000 00000000 00000000 00010100

左移两位(最右边两位添0)

原码(反码,补码):00000000 00000000 00000000 01010000

结果:80

5. >>(右移运算符)
举例1:-20>>2
原码:10000000 00000000 00000000 00010100

反码: 11111111   11111111   11111111  11101011(符号位不变,其他位取反)

补码: 11111111   11111111   11111111  11101100(反码 + 1)

右移两位(最左边两位添1)

补码: 11111111   11111111   11111111  11111011

反码: 11111111   11111111   11111111  11111010(补码 – 1)

原码: 10000000 00000000 00000000 00000101(符号位不变,其他位取反)

结果:-5

举例2:20>>2
原码(反码,补码):00000000 00000000 00000000 00010100

右移两位(最左边两位添0)

原码(反码,补码):00000000 00000000 00000000 00000101

结果:5

6. >>>(无符号右移运算符)
举例1:-2>>>1
原码:10000000 00000000 00000000 00000010

反码: 11111111  11111111   11111111  11111101(符号位不变,其他位取反)

补码: 11111111  11111111   11111111  11111110(反码 + 1)

右移1位(无符号位运算符,最左边一位只添0)

补码: 01111111  11111111   11111111  11111111

反码: 01111111  11111111   11111111  11111111(高位为0,正数)

原码: 01111111  11111111   11111111  11111111(与反码相同)

结果:2147483647

举例2:2>>>1
原码(反码,补码):00000000 00000000 00000000 00000010

右移一位(最左边一位添0)

原码(反码,补码):00000000 00000000 00000000 00000001

结果:1

7.额外知识
^=、|=、&=、<<=、>>=、>>>=与不加等号差不多,只是加入了赋值操作,以>>=为例:

public class Test {

    public static void main(String[] args) {

        int num = 2;
        System.out.println(num>>=1);
        System.out.println(num);
    }
    /**result:1  1
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114840.html原文链接:https://javaforall.net

(0)
上一篇 2021年9月29日 上午8:00
下一篇 2021年9月29日 上午9:00


相关推荐

  • git命令基本用法记录

    git命令基本用法记录最近使用git命令提交代码的时候发现很多命令都忘记了,于是重新学习了一下git命令。顺便整理了一下,加强记忆,也方便以后随时查看。以下命令都是平常工作中使用频率较高的命令,也是git的一些基本用法,其中[]内的参数表示可以省略,<>内的参数只是示例,具体名称视自己的项目而定,实际命令中不带<>,表示远程主机名,等表示分支名。1.git配置    获取本机sshkey:ssh-keygen-t-C“yourEmail@exampl

    2022年6月29日
    27
  • linux下安装anaconda3(linux系统下如何安装软件)

    从https://repo.continuum.io/archive/index.html上下载对应版本的Anaconda。比如我选择安装Anaconda3-5.0.1-Linux-x86_64.sh,(对应python3.6,x64系统)可以采用下列命令。wgethttps://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86

    2022年4月10日
    204
  • JavaScript获取当前日期

    JavaScript获取当前日期文章目录在 Javascript 中 通过 Date 方法可以获得当前日期 如下 getFullYear 获取当前年份 4 位 从 1970 年开始 getMonth 获取当前月份 0 11 0 代表 1 月 getDate 获取当前日 1 31 getDay 获取当前星期 X 0 6 0 代表星期日 首先我们需要 new 一个 date 对象 vard newDate d getFullYear 获取年 d getMont

    2026年3月18日
    2
  • 2008年世界顶级防火墙排名[通俗易懂]

    2008年世界顶级防火墙排名[通俗易懂]2008年世界顶级防火墙排名Toptenreview网站发布了2008年世界顶级防火墙排名,与2007年十大排名相比,只评出了1—7名。现将“金银铜奖”,以及官方排名网站和排名依据提供如下——官方排名网站和排名依据:[url]http://personal-firewall-software-review.toptenreviews.com/[/url]2008年世…

    2022年5月5日
    136
  • 简述python垃圾回收机制_理解Python垃圾回收机制

    简述python垃圾回收机制_理解Python垃圾回收机制一 垃圾回收机制 Python 中的垃圾回收是以引用计数为主 分代收集为辅 引用计数的缺陷是循环引用的问题 在 Python 中 如果一个对象的引用数为 0 Python 虚拟机就会回收这个对象的内存 执行 f1 会循环输出这样的结果 而且进程占用的内存基本不会变动 c1 ClassA 会创建一个对象 放在 0x237cf58 内存中 c1 变量指向这个内存 这时候这个内存的引用计数是 1delc1 后 c1 变量不再

    2026年3月18日
    1
  • 媒体谈OpenClaw火爆:普通人该急着“养虾”尝鲜吗?

    媒体谈OpenClaw火爆:普通人该急着“养虾”尝鲜吗?

    2026年3月13日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号