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)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • WMI远程访问问题解决方法

    WMI远程访问问题解决方法

    2021年8月4日
  • java线程dump命令_jdk的dump

    java线程dump命令_jdk的dumpjstack用于打印出给定的java进程ID或corefile或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项”-J-d64″,Windows的jstack使用方式只支持以下的这种方式:jstack[-l][F]pid如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的javastack和nativestack的信息,从而可以轻松地知道ja…

    2022年9月28日
  • ov7725摄像头模块_寄存器和内存

    ov7725摄像头模块_寄存器和内存上图是OV7725实现的整体框架,有点丑。FPGA描述SCCB时序,完成OV7725的配置,配置完成之后,OV7725sensor输出PCLK和href,vsync以及cmos_data信号。经过格式的转换单元,将格式转换后的数据送给SDRAM单元,最终实现VGA/LCD/上位机显示。 之前已经提及过,SCCB接口主要实现sensor内部各种寄存器的配置,如AGC,AWB,gama,c

    2022年9月16日
  • eclipse卸载android环境插件

    卸载eclipse-preference左侧导航栏中Android模块help-installnewsoftware–whatisalreadyinstalled?在弹出的界面选择android相关的插件卸载,重启eclipse

    2022年4月6日
  • 批处理之for命令[通俗易懂]

    批处理之for命令[通俗易懂]简述for命令是cmd中功能最强大的命令之一,for命令作用来执行迭代任务。下面是msdn中关于for命令语法的参考,建议中文和英文对照阅读,如果只看中文的话。有一些地方的翻译会难以理解,直接看英

    2022年7月3日
  • pycharm安装python3.6_python安装教程

    pycharm安装python3.6_python安装教程Pycharm安装+python3.9+配置过程一、安装Pycharm+python3.9Pycharm官网下载:https://www.jetbrains.com/pycharm/download/#section=windows点击Community下的Download进行下载。Python3.9官网下载:https://www.python.org/点击Download下的python3.9.2进入:下拉至最下面,点击windowsem

    2022年8月27日

发表回复

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

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