zoukankan      html  css  js  c++  java
  • Java基础东西(按位操作运算)

    http://aokunsang.iteye.com/blog/615658

    前奏:

       昨天一哥们问我Java位移你会吗,我说不会,想想位移这么麻烦,一般有位移的Java代码一律不看,有几个人会啊,是吧?但是那哥们的回答,让我郁闷半天:“这都不会啊,都是Java基础的东西呀!”我靠,我晕倒,听着老不爽了,so我决定对位移一探究竟,原来也这么随意啊,哈哈。因此,把心得总结如下,欢迎收看。

    在这里先感谢一下,JavaEye上的高手们的技术博客指点。TKS very much。

    技术总结:

    <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二进制形式: 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二进制形式: 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的倍数位都一样。

    $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得到位移后的值。

    ---------------------------------------------------------------------------------


    接下来在此说说位操作的好处,速度超快,这些都是底层的二进制机器操作指令。
      比如:a*2,

           1.jvm先为变量a分配空间;

           2.再进行a*2的操作;

          3.再把结果返回给相应的变量。
    而a<<1,和a*2一样,它只需要一条指令即可,速度很快。当然前三种位移操作都是对2的倍数

    进行操作时可用。



    再进行些许补充,谈到位操作,当然还要说到四个操作符:~(按位非),|(按位或),&(按位

    与),^(按位异或),这些都是大学计算机基础用法,对整数的二进制形式进行操作,然后再

    转换为整数,具体操作如下。
    1.~(按位非):【解义】对该整数的二进制形式逐位取反。
        ~4:(一元操作符)
         4的二进制形式为:00000000 00000000 00000000 00000100,逐位取反后得

    到:11111111 11111111 11111111 11111011,即为-5.
    2.|(按位或):【解义】对两个整数的二进制形式逐位进行逻辑或运算,原理为:1|0=1,0|0=0,1|1=1,0|1=1
    等。
        4|-5:
         4的二进制形式为:00000000 00000000 00000000 00000100,
        -5的二进制形式为:11111111 11111111 11111111 11111011,
      逐位进行逻辑或运算:11111111 11111111 11111111 11111111,即得到-1.
    3.&(按位与):【解义】对两个整数的二进制形式逐位进行逻辑与运算,原理:1|0=0,0|0=0,1&1=1;0&1=0等。 
       4&-5:
         4的二进制形式为:00000000 00000000 00000000 00000100,
        -5的二进制形式为:11111111 11111111 11111111 11111011,
      逐位进行逻辑与运算:00000000 00000000 00000000 00000000,即得到0.  

    实际应用:可以把字节转换为整数,-64&0xFF=192,也可以用八进制的形式,-64&0377=192、

    其实0xFF和0377都表示的是整数255、
    4.^(按位异或):【解义】对两个整数的二进制形式逐位进行逻辑异或运算,原理:1^1=0,1^0=1,0^1=1,0^0=0.
       4^-5:
         4的二进制形式为:00000000 00000000 00000000 00000100,
        -5的二进制形式为:11111111 11111111 11111111 11111011,
    逐位进行逻辑异或运算:11111111 11111111 11111111 11111111,即得到-1.

    实际应用:按位异或可以比较两个数字是否相等,它利用1^1=0,0^0=0的原理。  20^20==0

  • 相关阅读:
    Path Sum II
    Convert Sorted Array to Binary Search Tree
    Construct Binary Tree from Inorder and Postorder Traversal
    Construct Binary Tree from Preorder and Inorder Traversal
    Maximum Depth of Binary Tree
    Binary Tree Zigzag Level Order Traversal
    Binary Tree Level Order Traversal
    Same Tree
    Validate Binary Search Tree
    Binary Tree Inorder Traversal
  • 原文地址:https://www.cnblogs.com/wangwiz/p/7279301.html
Copyright © 2011-2022 走看看