zoukankan      html  css  js  c++  java
  • Java位运算符&、|、^、>>、<<、~、>>>

    如果要搞懂Java中的位运算符,首先要搞懂二进制的运算,之前一篇有介绍详细请看 二进制运算-十进制与二进制的转换

    Java中的位运算符有:&(按位与)、|(按位或)、^(按位异或)、>>(右移)、<<(左移)、~(取反)、>>>(无符号右移)

    下面来逐一介绍:

    &(按位与)

    int i = 5&2;
    int j = 7&3;
    System.out.println("i="+i);//i=0
    System.out.println("j="+j);//j=3

    按位与的运算规则是先将两边转换为二进制,再计算最终值,运算规则“逢0变0”,即1&1=1,1&0=0,0&1=0,0&0=0

    5的二进制101,2的二进制10,5&2即为101&10,不足位补0,101&010,根据运算规则得出最终值0,十进制也是0

    7的二进制111,3的二进制11,7&3即为111&011,根据运算规则得出最终值011,转换为十进制就是3

    |(按位或)

    int i = 6|2;
    int j = 5|3;
    System.out.println("i="+i);//i=6
    System.out.println("j="+j);//j=7

    按位或的运算规则是先将两边转换为二进制,运算规则“逢1变1”,即1|1=1,1|0=1,0|1=1,0|0=0

    6的二进制110,2的二进制10,6|2即为110|010,根据运算规则得出最终值110,十进制就是6

    5的二进制101,3的二进制11,5|3即为101|011,根据运算规则得出最终值111,十进制就是

    ^(按位异或)

    int i = 7^3;
    int j = 5^2;
    System.out.println("i="+i);//i=4
    System.out.println("j="+j);//j=7

    按位异或,顾名思义数位上不一样即为1,其运算规则为1^1=0,1^0=1,0^1=1,0^0=0

    7的二进制111,3的二进制11,7^3等同于111&011,根据运算规则结果100,十进制4

    5的二进制101,2的二进制10,5^2等同于101^010,结果111,十进制7

    <<(左移)

    int i = 2<<3;
    int j = 5<<2;
    System.out.println("i="+i);//i=16
    System.out.println("j="+j);//j=20

    左移就是数值二进制的有效值往左移,移的位数就是“<<”符号右边的值,2<<3就是2的二进制的有效值往左移3位,右边补0

    2的二进制0000 0010,左移3位为0001 0000,十进制为16

    5的二进制0000 0101,左移2位为0001 0100,十进制为20

    >>(右移)

    int i = 9>>2;
    int j = 15>>3;
    System.out.println("i="+i);//i=2
    System.out.println("j="+j);//j=1

    右移跟左移是相反的,右移就是往右边移N位,正数左边补0,负数左边补1

    9的二进制0000 1001,右移2位,0000 0010,十进制2

    15的二进制0000 1111,右移3位,0000 0001,十进制1

    ~(取反)

    int i = ~5;
    int j = ~8;
    System.out.println("i="+i);//i= -6
    System.out.println("j="+j);//j= -9

    取反就是转为二进制之后1为0,0为1

    5的二进制0000 0000 0000 0000 0000 0000 0000 0101,取反1111 1111 1111 1111 1111 1111 1111 1010,反码的值十进制为-6

    其实还有一种更好理解的方式,想象一杆数轴,以0和-1的中间点为中心点对折同位置重叠的即为取反的值,简单的说取反就是相反数减一

    >>>(无符号右移)

    int i = 5>>>2;
    int j = -5>>>2;
    System.out.println("i="+i);//i= 1
    System.out.println("j="+j);//j= 1073741822

    无符号右移在正数的计算和右移是没有区别的,区别在于负数的计算

    -5的二进制为1111 1111 1111 1111 1111 1111 1111 1011(负数的转换方式之前已经讲过了),右移两位00 1111 1111 1111 1111 1111 1111 1111 10,左边补0,而在>>中左边补1

    >>:有符号右移运算,若参与运算的数字为正,则在高位补0,若为负则在左边高位补1

    >>>:无符号右移运算,无论参与运算的数字为正数还是负数,都在左边高位补0

  • 相关阅读:
    element-ui el-tree竖向滚动条和横向滚动条问题
    菜单加滚动条相关样式
    echarts tree 树图总结,点击父节点动态生成子节点,树图数据过多高度自适应,点击子节点跳转页面。
    基于Mininet测量路径的损耗率
    RyuBook1.0案例一:Switching Hub项目源码分析
    深度学习之稠密连接⽹络(DENSENET)
    图形学之图像信号处理
    图形学之卷积滤波器
    图形学之信号处理
    Lecture13_光线追踪1(Whitted-Style Ray Tracing)_GAMES101 课堂笔记
  • 原文地址:https://www.cnblogs.com/saltiest/p/11569371.html
Copyright © 2011-2022 走看看