美文网首页
Java中的位移运算

Java中的位移运算

作者: 千锋陈老师 | 来源:发表于2019-08-08 16:39 被阅读0次

在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。

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

相关文章

  • Java中的位移运算

    在Java中,位移运算属于基本运算,符号是<<和>>,即向左位移和向右位移。在Java中只有整数才能位移,所以其他...

  • 一文搞明白位运算、补码、反码、原码

    在平时看各种框架的源码的过程中,经常会看到一些位移运算,所以作为一个Java开发者是一定掌握位移运算的。 正数位移...

  • java中的运算符

    内容 算数运算符 赋值运算符 比较运算符 逻辑运算符 位运算符 位移运算符 三元运算符java中的运算符,有以下几...

  • Java和Javascript中位移运算

    参考:https://www.cnblogs.com/thtlovelife/p/8664404.html ht...

  • java位移运算总结

    (1)计算中负数都是以补码形式进行存储的; (2)计算机中数的运算都是补码方式参与运算; (3)正数的原码、反码、...

  • JS中的位移运算

    快速理解位运算: 位运算比其他运算(加减乘除)更加底层,所以运算的更快,但是不是所有场景都可以用 位运算只针对整数...

  • 位移运算

    位移运算 无符号位移 >>> 无符号右移,无符号位运算用 0 补位 <<< 无符号左移 带符号位移 >> 带符号...

  • 位移运算

    /*======================================================*...

  • 开发基础随笔之位运算符(Bitwise Operators)

    位运算符,属于算术运算符 按位逻辑运算符: 位移运算符: 位运算符的运算数只能是整数 位移运算符:按位左移 a<<...

  • Java基础系列之位移

    Java中的位移其实我们很少使用,但是大家一定要明白位移的原理

网友评论

      本文标题:Java中的位移运算

      本文链接:https://www.haomeiwen.com/subject/qpoxjctx.html