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


相关推荐

  • H3C 交换机配置命令[通俗易懂]

    H3C 交换机配置命令[通俗易懂]H3C交换机配置命令三层和二层交换机配置命令disthis查看下属命令save保存reboot重启初始化命令和提示选项resetsaved-configuration初始—-清除所有配置信息后提示是否初始化:Thesavedconfigurationfilewillbeerased.Areyousure?Yreboot重启初始化密码h3c…

    2022年6月20日
    143
  • 测试19

    测试19一、Linux必备知识linux作为现在最流行的软件环境系统,一定需要掌握,目前的招聘要求都需要有linux能力。二、Shell脚本掌握shell脚本,包括shell基础与应用、shell逻辑控

    2022年7月1日
    22
  • Windows和Linux下查看Apache、MySQL、PHP版本

    Windows和Linux下查看Apache、MySQL、PHP版本

    2021年10月8日
    70
  • verilog语言转vhdl语言_vhdl转换为verilog

    verilog语言转vhdl语言_vhdl转换为verilog1.下载后先运行X-HDL-4.2.1-Setup.exe文件,选择安装路径,注意路径中不要有中文。2.运行crack_xhdl_4.2.1.exe文件,选择刚刚你安装XHDL的路径下的\bin文件夹,点击next—finish,出现success代表激活成功教程成功。3.可能会要求你重启电脑,这时候同意重启就好了。4.重启之后运行X-HDL。5.可以选择VHDL转Verilog或Verilog转…

    2022年9月21日
    0
  • Web前端性能优化——如何提高页面加载速度

    Web前端性能优化——如何提高页面加载速度

    2021年10月14日
    32
  • Angular面试题_vue框架面试题

    Angular面试题_vue框架面试题一、ng-show/ng-hide与ng-if的区别?第一点区别是,ng-if在后面表达式为true的时候才创建这个dom节点,ng-show是初始时就创建了,用display:block和display:none来控制显示和不显示。第二点区别是,ng-if会(隐式地)产生新作用域,ng-switch、ng-include等会…

    2022年9月2日
    3

发表回复

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

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