• Java中的位运算符


      Java提供的位运算符有:左移( << )、右移( >> ) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符。

      PS:所有的位运算操作都是基于二进制补码进行的,干开发的都应该知道相关知识吧,我就不多哔哔。

      在移位运算时,byte、short和char类型移位后的结果会变成int类型,对于byte、short、char和int进行移位时,规定实际移动的次数是移动次数和32的余数,也就是移位33次和移位1次得到的结果相同。移动long型的数值时,规定实际移动的次数是移动次数和64的余数,也就是移动66次和移动2次得到的结果相同。  

    <<(左移)

      按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。   

      语法格式   需要移位的数字 << 移位的次数
      例如: 

    System.out.println("'<<'位操作符(10 << 3):" + (10 << 3));
    
    ----------
    输出结果
        80

      首先把10转换为二进制数字0000 0000 0000 0000 0000 0000 0000 1010,然后把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,最后在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0010 1000,则转换为十进制是80.

      数学意义
      在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。 即:10*2^3=80 

    >>(右移)

      按二进制形式把所有的数字向右移动对应val位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1.
      语法格式  需要移位的数字 >> 移位的次数
      例如

    System.out.println("'>>'位操作符(10 >> 3):" + (10 >> 3));
    System.out.println("'>>'位操作符(-10 >> 3):" + (-10 >> 3));

    ---------- 输出结果 

      '>>'位操作符(10 >> 3):1 
      '>>'位操作符(-10 >> 3):-2

      10的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1010,然后把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 0001.转换为十进制是1.即:10/2^3 取整 1
      数学意义   右移一位相当于除2,右移n位相当于除以2的n次方。

    >>>(无符号右移)

      按二进制形式把所有的数字向右移动对应val位数,低位移出(舍弃),高位的空位补零。对于正数来说和带符号右移相同,对于负数来说不同。

    System.out.println("'>>>'位操作符(-10 >>> 3):" + (-10 >>> 3));
    System.out.println("'>>>'位操作符(10 >>> 3):" + (10 >>> 3));

    ------------ 输出结果:

      '>>>'位操作符(-10 >>> 3):536870910
      '>>>'位操作符(10 >>> 3):1

      对-10右移三位的过程为:舍弃二进制数的最后三位,在二进制数的开头增加三个0,导致原来的符号位由‘1’变成了‘0’,由负数变成了正数;

      -10的二进制原码: 1000  0000  0000  0000  0000  0000  0000 1010,

            反码:1111  1111  1111  1111  1111  1111  1111  0101

            补码:1111  1111  1111  1111  1111  1111  1111  0110

      补码右移三位后  ‭0001 1111  1111  1111  1111  1111  1111  1110,转换成十进制 536870910

    & (与运算符)

      与运算时,进行运算的两个数,从最低位到最高位,一一对应。如果某 bit 的两个数值对应的值都是 1,则结果值相应的 bit 就是 1,否则为 0.  

      0 & 0 = 0,
    
      0 & 1 = 0,
    
      1 & 1 = 1
    System.out.println("'&'位操作符(10 & 3):" + (10 & 3));
    
    ---------
    输出结果:
        '&'位操作符(10 & 3):2    

     |(或运算符)

      与运算时,进行运算的两个数,从最低位到最高位,一一对应。如果某 bit 的两个数值对应的值只要 1 个为 1,则结果值相应的 bit 就是 1,否则为 0。

        0 | 0 = 0,
    
        0 | 1 = 1,
    
        1 | 1 = 1
    System.out.println("'|'位操作符(10 | 3):" + (10 | 3));

    ----------
    输出结果:
      '|'位操作符(10 | 3):11

    ~ (取反运算符)

      对操作数的每一位进行操作,1 变成 0,0 变成 1。 

    System.out.println("'~'位操作符(~ 10):" + (~10));
    System.out.println("'~'位操作符(~ -10):" + (~-10));
    ---------- 
    输出结果:
      
    '~'位操作符(~ 10):-11
      '~'位操作符(~ -10):9

       10的二进制原码  0000  0000  0000  0000  0000  0000  0000  1010  反码,补码 同

          ~取反操作后:1111  1111  1111  1111  1111  1111  1111  1111  0101   补码

          反码: 1111  1111  1111  1111  1111  1111  1111  1111  0100

          原码:1000  0000  0000  0000  0000  0000  0000  1011   即  -11  

      个人猜想:N进行取反操作的结果是不是 -N-1????     

    ^ (异或运算符)

      两个操作数进行异或时,对于同一位上,如果数值相同则为 0,数值不同则为 1。

    System.out.println("'^'位操作符(10^3):"+(10^3));
    
    System.out.println("'^'位操作符(9^3):"+(9^3));
    
    System.out.println("'^'位操作符(9^10):"+(9^10));
    
    -------------
    输出结果:
        '^'位操作符(10^3):9
        '^'位操作符(9^3):10
        '^'位操作符(9^10):3    

    相信从这个例子,你们也应该看明白异或操作的规律了吧。

    小结   

    二进制运算符,包括位运算符和移位运算符,使程序员可以在二进制基础上操作数字,可以更有效的进行运算,并且可以以二进制的形式存储和转换数据,是实现网络协议解析以及加密等算法的基础。

  • 相关阅读:
    shell命令执行过程
    shell中的引用
    ansible小结
    centos自动化安装镜像制作
    centos kickstart
    centos内核引导参数
    C# .NET 遍历Json 形成键值对
    强大的Winform Chart图表控件使用说明
    C#实现转换十六进制
    C# 批量登陆远程目录
  • 原文地址:https://www.cnblogs.com/JackpotHan/p/9719133.html
Copyright © 2020-2023  润新知