java 负数 位移运算_Java中的位移运算

java 负数 位移运算_Java中的位移运算在 Java 中 位移运算属于基本运算 符号是 lt gt 即向左位移和向右位移 在 Java 中只有整数才能位移 所以其他的不考虑 位移运算是将整数在内存中表示的二进制进行位移 所以在 Java 中分为正数和负数的位移 对于正数来说 向左位移 即 lt gt 相当于除以 2 注意是整数除以整数 例如 5 gt gt 1 即 5 2 2 下面举例说明 5 lt lt 1 我们以 int 为例 数字 5in

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

对于正数来说,向左位移,即<>相当于除以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。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225078.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午10:10
下一篇 2026年3月17日 上午10:11


相关推荐

  • 悉数僵尸网络:知己知彼 百战不殆

    悉数僵尸网络:知己知彼 百战不殆僵尸计算机种类知多少  研究中发现,网络中存在着各式各样的僵尸计算机类型。以下我们将讨论几种比较流行和危害面较大的僵尸类型。我们将介绍几种恶意软件的基本概念,然后再详尽的描述它们的特征。此外,我们还将描述僵尸的源代码以及它们的命令设置清单。  1.Agobot/Phatbot/Forbot/XtremBot  这些很可能是最出名的僵尸类型。目前,杀毒软件厂商Sophos已经查明了Ago

    2022年7月25日
    19
  • C语言入门项目篇:贪吃蛇(完整代码+详细注释)「建议收藏」

    C语言入门项目篇:贪吃蛇可直接运行。#include<stdio.h>#include<stdlib.h>#include<windows.h>#include<time.h>#include<conio.h>/*大一上的时候C语言入门学的一个小游戏。还是挺有意思的,有兴趣的同学可以继续优化下:比如蛇头碰到蛇身就判定为输/给蛇身加点颜色等。*///1.2食物结构体#defineMAPHEIGHT25#defi

    2022年4月4日
    121
  • Python实现向量自回归(VAR)模型——完整步骤「建议收藏」

    废话不多说,先开始分享:1.首先啥是VAR模型,我这里简略通俗的说一下,想看代码的童鞋直接跳到第3部分就好了:以金融价格为例,传统的时间序列模型比如ARIMA,ARIMA-GARCH等,只分析价格自身的变化,模型的形式为:其中称为自身的滞后项。但是VAR模型除了分析自身滞后项的影响外,还分析其他相关因素的滞后项对未来值产生的影响,模型的形式为:其中就是其他因子的滞后项…

    2022年4月15日
    1.2K
  • 计算机win7卡顿如何解决方法,win7卡顿严重解决方法_win7运行卡顿严重最流畅设置方法-win7之家…[通俗易懂]

    计算机win7卡顿如何解决方法,win7卡顿严重解决方法_win7运行卡顿严重最流畅设置方法-win7之家…[通俗易懂]在使用win7系统电脑的时间一长,出现的电脑故障也就会越多,这大多数都是用户自己所造成的,例如有用户的win7系统在运行过程中总是会出现严重卡顿的情况,这让许多用户都感到很难受,那么win7卡顿严重怎么解决呢?下面小编就来告诉大家win7运行卡顿严重最流畅设置方法。具体方法:1、右击【计算机】选择属性;2、在出现的面板的左侧栏选择【高级系统设置】;3、依次点击【高级】【设置】;4、默认是【让系统选…

    2025年11月1日
    4
  • laravel 5.6 请教邮件中的cc,bcc是什么意思,有什么用?

    laravel 5.6 请教邮件中的cc,bcc是什么意思,有什么用?

    2021年10月24日
    85
  • MS17010漏洞利用总结

    MS17010漏洞利用总结0x01常规打法扫描是否存在ms17-010漏洞:nmap-n-p445–scriptsmb-vuln-ms17-010192.168.1.0/24–openMSF常规漏洞利用:msf>useexploit/windows/smb/ms17_010_eternalbluemsf>setrhost192.168.1.112反向打:msf>setpayloadwindows/x64/meterpreter/reverse_tcpm

    2022年6月12日
    93

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号