Java中的按位右移运算符

2023-12-03

在 Java 中,-4 >> 2 给出 -1,但 -5 >> 2 给出 -2。有人能解释一下为什么吗? 这是示例代码:

byte r=-5;
r>>=2;
System.out.println(r);

同样在这种情况下 >> 和 >>> 运算符给出相同的答案。谁也能解释一下吗?


你可以看一下位。使用二进制补码符号,位为-4 and -5是,为简洁起见,仅显示最后 8 位:

-4: 1111 1100      
-5: 1111 1011

位右移 2 位,带符号扩展:

-4 >> 2: 1111 1111 (-1)
-5 >> 2: 1111 1110 (-2)

通常情况下,你会想到>>>不使用符号扩展,这是事实,但在这种情况下:

r >>>= 2;

... 价值r被提升为int对于使用二进制数字提升的位移操作,但复合赋值运算符将返回值转换回byte,移入的零“消失”。

byte r = -5;     // 1111 1100
r >>>= -2;       // promoted to int:   11111111 11111111 11111111 11111010
                 // bit shift:         00111111 11111111 11111111 11111110
                 // cast back to byte: 11111110 (-2)

The JLS,第 15.26.2 节,讨论复合赋值运算符中完成的转换操作:

E1 op= E2 形式的复合赋值表达式等效于 E1 = (T) ((E1) op (E2)),其中 T 是 E1 的类型,但 E1 仅计算一次。

也就是说,在这种情况下,位移的结果被投射回byte.

当值的值相同时,会发生相同的转换回字节操作r is -4.

请注意,如果作业部分未完成,那么您将不会看到相同的答案,因为它不会将结果转换回byte:

System.out.println(r >>> 2);

然后你会看到:

1073741822
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中的按位右移运算符 的相关文章

随机推荐

  • 在 R 中获得多种分区方法的共识

    My data data cbind c 1 1 2 1 1 3 c 1 1 2 1 1 1 c 2 2 1 2 1 2 colnames data paste item 1 3 rownames data paste method 1 6
  • 插入后mysql返回索引

    我的方法是设置一个运行良好的插入命令 它将条目添加到我的数据库中 因为我想使用从第一次插入中获得的唯一索引在其他表中插入其他条目 我执行查询获取索引 然后重用它其他插入 虽然这很好用 我相信一定有更好的方法 有什么建议么 谢谢 对于自动增量
  • 灵活的锁定替代方案(选择性锁定)

    我需要解决具有不同内存位置的相同对象的情况 由于多线程 它发生在 REST 请求中 因此 作为解决方案的一部分 我实施了服务 我在这里分享最重要的部分 private Map
  • AngularJS错误.success不是一个函数

    我已经构建了一个工厂来处理控制器的函数 但不知何故控制器在其中一个函数上返回错误 错误 Auth getUser success 不是函数 http localhost 8080 app controllers mainCtrl js 10
  • 消失的对象 - Three.js CanvasRenderer

    我很困惑 我不明白为什么我的对象会随着画布渲染器消失 虽然它与 webGL 渲染器完全按照预期工作 但我需要在移动设备上显示它 因此无法访问 webGL 渲染器 我尝试过 overdraw true 但这似乎并没有使丢失的对象消失 http
  • 动画切换按钮

    我已经创建了动画切换 如果android checked true 即 它可以从 1 9 播放 但是如果android checked false 它卡在了drawable 10 但应该从10 20开始播放 从那时起它就完美了 但是当应用程
  • Swift 通用数组“不相同”错误

    我只是在浏览一些 Swift 的内容 这些内容在 Beta3 中显然已经过时了 func exchange
  • EF4.2 额外左外连接到同一个表

    我知道已经有一些关于此的问题 大多数与已解决的旧问题或多个表有关 我看到的任何其他 左外连接 问题都没有涵盖这个问题 我得到了INNER JOIN and LEFT OUTER JOIN在同一个查询中访问同一个表 表格概要 Users id
  • Android:捕获活动的返回

    我有一个关于开展新活动的问题 归根结底就是这样 我的视图上有 3 个选项卡 A contains gMap activity B camera activity C some random text fields 要求是应用程序以纵向模式运
  • 是否可以在 android gradle 中将 git 存储库声明为依赖项?

    我想使用 mavencentral 的库的主版本 是否可以在 android gradle 中将 git 存储库声明为依赖项 对我来说最好的方法是 https jitpack io 步骤 1 将 JitPack 存储库添加到存储库末尾的 b
  • OmniSharp.MSBuild.ProjectManager 无法在 Linux 上加载项目

    我正在我的 Manjaro Linux 笔记本上学习 C 我尝试安装 ms vscode csharp 扩展 但是在打开任何 NET Core 项目时 我收到以下错误消息 某些项目加载时遇到问题 请查看输出以了解更多信息 信息 我尝试设置
  • setuptools:包数据文件夹位置

    我使用 setuptools 来分发我的 python 包 现在我需要分发额外的数据文件 根据我从 setuptools 文档中收集的信息 我需要将数据文件放在包目录中 但是 我宁愿将数据文件放在根目录的子目录中 我想避免的 root sr
  • 如何防止点击页面按钮后 Django 表单被重置

    我有一个 Django 表单 它接受用户的输入值 然后使用这些值对表进行查询ResourceBase 最终返回过滤结果的列表 由于结果可能是一个很长的列表 我添加了带有 上一页 和 下一页 按钮的分页功能 我的问题是 当我单击 上一个 或
  • 使用 gsub 从 R 中的数据集中删除主题标签、超链接和 Twitter 句柄

    我已经搜索过 但一无所获 可能是因为我对 R 非常陌生 不理解 并且被吓倒 模式匹配和正则表达式替换的逻辑 语法是如何工作的 所以我希望有人可以帮助我使用 R 中删除主题标签所需的特定代码 例如 trump 删除超链接 例如pic twit
  • 如何执行浏览器内对比度拉伸/标准化?

    我的网页上有 jpeg 我想在没有浏览器插件的情况下对这些图像执行客户端均衡 对比度拉伸 我也接受直方图均衡的解决方案 我目前使用两个 CSS 过滤器组合的较差近似值 webkit filter contrast brightness 我希
  • 文件下载到 Cordova 中的 Android 下载文件夹

    这是代码 function downloadCL document addEventListener deviceready init false The directory to store data var store var asse
  • 如何使实体框架数据上下文只读

    我需要向第三方插件公开实体框架数据上下文 目的是允许这些插件仅获取数据 而不是让它们发出插入 更新或删除或任何其他数据库修改命令 因此 我怎样才能使数据上下文或实体只读 除了与只读用户连接之外 您还可以对 DbContext 执行一些其他操
  • 如何在不暂停脚本的情况下监听 STDIN 输入?

    我有一个while循环持续侦听传入连接并将其输出到控制台 我希望能够通过控制台发出命令而不影响输出 我试过了 Thread new do while true input gets chomp puts So I herd u sed in
  • 如何在 Swift 中的路径中查找没有路径扩展的文件的文件 UTI

    我一直在尝试转换我从中得到的代码example 在 Objective c 中 没有运气 String path contains the file path Get the UTI from the file s extension CF
  • Java中的按位右移运算符

    在 Java 中 4 gt gt 2 给出 1 但 5 gt gt 2 给出 2 有人能解释一下为什么吗 这是示例代码 byte r 5 r gt gt 2 System out println r 同样在这种情况下 gt gt 和 gt