• 关于java按位操作运算


    <1>.在了解位移之前,先了解一下正数和负数的二进制表示形式以及关系:
    举例15和-15:


    15 的原码: 00000000 00000000 00000000 00001111 
           补码: 11111111 11111111 11111111 11110000
                     +1 = 
    -15的原码:11111111 11111111 11111111 11110001

    负数的原码即为:正数的原码取反,再加1。

    <2>位移操作:(只针对 int类型的数据有效,java中,一个int的长度始终是32位,也就是4个字节,它操作的都是该整数的二进制数).也可以作用于以下类型,即 byte,short,char,long(当然,它们都是整数形式)。当为这四种类型是,JVM先把它们转换成int型再进行操作。

    <<     左移   
    >>     右移
    >>>    无符号右移

    << 和>>为数值位移,>>>为逻辑位移。【注】:Java中不存在<<<。

    $1> m<<n的含义:把整数m表示的二进制数左移n位,高位移出n位都舍弃,低位补0.  (此时将会出现正数变成负数的形式)
    实例:
      3<<2剖析:3乘以2的2次方
      3二进制形式: 00000000 00000000 00000000 00000011,按照$1的原理,得到00000000 00000000 00000000 00001100,即为12. 
      
      左移使整数变为负数:
      10737418<<8
      10737418二进制表示形式:00000000 10100011 11010111 00001010,按照$1的原理,得到10100011 11010111 00001010 00000000,即为:-1546188288.

    $2> m>>n的含义:把整数m表示的二进制数右移n位,m为正数,高位全部补0;m为负数,高位全部补1.
    实 例: 
      3>>2剖析:3除以2的2次方
      3二进制形式: 00000000 00000000 00000000 00000011,按照$2的原理,得到00000000 00000000 00000000 00000000,即为0.
      -3>>2剖析:
      -3二进制形式: 11111111 11111111 11111111 11111101,按照$2的原理,得到11111111 11111111 11111111 11111111,即为-1.

    以上:每 个整数表示的二进制都是32位的,如果右移32位和右移0位的效果是一样的。依次类推,右移32的倍数位都一样。

    备注:对于右移32位与右移0位是结果是一样的,我一直不能够理解。现在我只能理解为32比较特殊。相当于整体全移。与移0位相同。左移也是一样的。

    $3> m>>>n:整数m表示的二进制右移n位,不论正负数,高位都补零。
    实例: 
      3>>>2剖析:
      3二进制形式: 00000000 00000000 00000000 00000011,按照$3的原理,得到00000000 00000000 00000000 00000000,即为0.
      -3>>>2剖析:
      -3二进制形式: 11111111 11111111 11111111 11111101,按照$3的原理,得到00111111 11111111 11111111 11111111,即为1073741823.
       

    【注】:对于$1,$2,$3,如果n为负数:这时JVM会先让n对32取模,变成一个绝对值小于32的负数,然后再加上32,直到 n 变成一个正数。
    实例:
       4<<-10
       4的二进制形式:00000000 00000000 00000000 00000100,-10对32取模再加上32,不用说了,得到22,则4<<-10,即相当于4<<22。
       此时按照再按照$1原理,得到00000001 00000000 00000000 00000000,得到的即为:16777216。

    OK, 大功告成。

    综上所述:
       m<<n即在数字没有溢出的前提下,对于正数和负数,左移n位都相当于m乘以2的n次方.
       m>>n即相当于m除以2的n次方,得到的为整数时,即为结果。如果结果为小数,此时会出现两种情况:(1)如果m为正数,得到的商会无条件 的舍弃小数位;(2)如果m为负数,舍弃小数部分,然后把整数部分加+1得到位移后的值。 

  • 相关阅读:
    windows server 2008 r2 切换windows 7主题方法
    JAVA环境安装
    Oracle 11gR2 安装教学
    webmin-1.810 安装
    Windows Squid 安装配置
    Zyxel Switch-How to block a fake DHCP server without enabling DHCP snooping?
    Java介绍
    cookies和session区别
    牛刀小试之Django二
    小试牛刀之Django
  • 原文地址:https://www.cnblogs.com/zhaojinhui/p/5530489.html
Copyright © 2020-2023  润新知