• Java中的位移运算


    在Java中,位移运算属于基本运算,符号是<<和>>,即向左位移和向右位移。在Java中只有整数才能位移,所以其他的不考虑,位移运算是将整数在内存中表示的二进制进行位移,所以在Java中分为正数和负数的位移。

    对于正数来说,向左位移,即<<相当于乘以2,移动多少次即乘以多少次2,例如5<<2即5 * 2 * 2 = 20,而向右位移即>>相当于除以2,注意是整数除以整数。例如 5 >> 1 即5/2=2。

    下面举例说明:

    5<<1,我们以int为例:

    数字5

    int型的二进制表示为: 0000 0000 0000 0000 0000 0000 0000 0101

    向左移1位即: 0000 0000 0000 0000 0000 0000 0000 1010 (后位补0)

    所以结果为:数字10

    5>>1,我们以int为例:

    数字5

    int型的二进制表示为: 0000 0000 0000 0000 0000 0000 0000 0101

    向右移1位即: 0000 0000 0000 0000 0000 0000 0000 0010 (高位补0)

    所以结果为:数字2

    所以对于正数,可以随意使用位移,与乘除几乎没有结果的区别,而且性能更优。

    而对于负数来说,Java中的位移应该谨慎使用,因为位移运算在Java中称为带符号的位移。那么到底带符号的位移是如何计算的呢,下面直接举例说明:

    -5<<1,我们以int为例,由于负数在内存是以补码存在,请看:

    数字-5

    int型的二进制原码表示为: 1000 0000 0000 0000 0000 0000 0000 0101

    而其反码为:1111 1111 1111 1111 1111 1111 1111 1010

    补码为:1111 1111 1111 1111 1111 1111 1111 1011

    向左移1位即结果为:1111 1111 1111 1111 1111 1111 1111 0110 (后位补0)

    将结果计算反码为:1111 1111 1111 1111 1111 1111 1111 0101

    将结果计算原码为:1000 0000 0000 0000 0000 0000 0000 1010

    所以结果为:数字-10

    看起来好像还是乘以2,但是换个数字来试试:

    例如数字的二进制如果为:1110 0000 0000 0000 0000 0000 0000 0001

    而其反码为:1001 1111 1111 1111 1111 1111 1111 1110

    补码为:1001 1111 1111 1111 1111 1111 1111 1111

    向左移1位即结果为:0011 1111 1111 1111 1111 1111 1111 1110

    这个结果的最高位是0,所以必然是个正数,所以结果并非想象的乘以2。

    如果是右移,那么高位会补1,结果一样不算正常,例如:

    -5>>1,我们以int为例,由于负数在内存是以补码存在,请看:

    数字-5

    int型的二进制原码表示为: 1000 0000 0000 0000 0000 0000 0000 0101

    而其反码为:1111 1111 1111 1111 1111 1111 1111 1010

    补码为:1111 1111 1111 1111 1111 1111 1111 1011

    向右移1位即结果为:1111 1111 1111 1111 1111 1111 1111 1101 (高位补1)

    将结果计算反码为:1111 1111 1111 1111 1111 1111 1111 1100

    将结果计算原码为:1000 0000 0000 0000 0000 0000 0000 0011

    所以结果为:数字-3

    而在Java中,-5除以2应该结果为-2,但是位移却为-3。

    另外,如果是下面的例子:

    -1>>1,我们以int为例,由于负数在内存是以补码存在,请看:

    数字-1

    int型的二进制原码表示为: 1000 0000 0000 0000 0000 0000 0000 0001

    而其反码为:1111 1111 1111 1111 1111 1111 1111 1110

    补码为:1111 1111 1111 1111 1111 1111 1111 1111

    向右移1位即结果为:1111 1111 1111 1111 1111 1111 1111 1111 (高位补1)

    所以结果不用慢慢算就知道为:数字-1

    所以对于-1来说,无论怎么右移,结果还是-1,而如果是除以2,结果是0。

    最后总结一句,如果是正数,当可以使用位移运算时可以尽量使用,能提升性能,而对于负数来说,还是尽量别用吧,结果与除法相差太远。

  • 相关阅读:
    weiPHP微信开发框架
    win7系统
    csdn博客频道
    一步一步安装Git控件版本工具
    php源码,php网站源码,php源码下载
    czz数据专家
    禁用了传说中的PHP危险函数之后,Laravel的定时任务不能执行了?
    php禁用函数设置及查看方法详解
    laravel项目thinksns-plus安装出现RuntimeException Symlink from * to * failed错误
    laravel框架使用中错误及解决办法总结
  • 原文地址:https://www.cnblogs.com/qfchen/p/11322098.html
Copyright © 2020-2023  润新知