Java位移位的奇怪之处

2024-03-01

Java 有 2 个用于右移的位移运算符:

>> shifts right, and is dependant on the sign bit for the sign of the result

>>> shifts right and shifts a zero into leftmost bits

http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html

这看起来相当简单,所以任何人都可以向我解释为什么这段代码在为 bar 指定 -128 的值时,为 foo 生成 -2 的值:

byte foo = (byte)((bar & ((byte)-64)) >>> 6);

其目的是获取一个 8 位字节,最左边 2 位的掩码,并将它们移位到最右边的 2 位。 IE:

initial = 0b10000000 (-128)
-64 = 0b11000000
initial & -64 = 0b10000000
0b10000000 >>> 6 = 0b00000010

结果实际上是-2,即

0b11111110

IE。 1 而不是零被移到左侧位置


这是因为 & 实际上是在执行提升int- 这留下了很多“1”位。然后右移,将最左边的 2 位保留为 0,然后通过转换回字节来忽略这些最左边的位。

当您分离出操作时,这一点会变得更清楚:

public class Test
{
    public static void main(String[] args)
    {
        byte bar = -128;
        int tmp = (bar & ((byte)-64)) >>> 6;
        byte foo = (byte)tmp;
        System.out.println(tmp);
        System.out.println(foo);
    }
}

prints

67108862
-2

因此,再次进行位算术:

initial = 0b10000000 (-128)
-64 = 0b11000000
initial & -64 = 0b11111111111111111111111110000000 // it's an int now
0b10000000 >>> 6 = 0b00111111111111111111111111100000 // note zero-padding
(byte) (0b10000000 >>> 6) = 11100000 // -2

即使您从 & 操作中获得了正确的结果(通过在该点进行转换),>>>将提升第一个操作数int无论如何首先。

编辑:解决方案是改变掩盖事物的方式。不要使用 -64 进行掩码,而只需使用 128+64=192=0xc0 进行掩码:

byte foo = (byte)((bar & 0xc0) >>> 6);

这样一来,您实际上只留下您想要的两位,而不是在最高有效的 24 位中加载 1。

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

Java位移位的奇怪之处 的相关文章

  • 从 BroadcastReceiver 获取方法来更新 UI

    我正在尝试根据变量的变化更新用户界面BroadcastReceiver 因此 我需要调用一个扩展类的方法 以获取我提到的变量 BroadcastReceiver in MainActivity取决于但我无法以任何方式获得真正的返回值 扩展的
  • 无法将 INode 类型值分配给 类型变量。为什么?

    我想知道为什么以下代码无法工作 public static
  • 如何停止使用扫描仪从标准输入读取多行?

    我正在做一个 JAVA 作业 应该处理多行输入 指令显示 输入是从标准输入读取的 给出了示例输入的示例 one 1 two 2 three 3 我不明白上面的示例输入 从标准输入读取 是什么意思 这是我编写的一个测试程序 它可以消除我的困惑
  • Ant 中回显目标描述

  • 想要从java中的char数组创建字符流

    我想从 char 数组构造一个流以使用 java 8 功能 例如过滤器和映射 char list a c e Stream
  • javax.persistence.TransactionRequiredException:没有可用于当前线程的实际事务的 EntityManager

    我使用 Hibernate 创建了我的第一个 Spring MVC 项目 我的 DAO 层使用 JPA EntityManager 与数据库交互 GenericDao java Repository public abstract clas
  • 为什么Java中的文件名与公共类名相同? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在Java中 文件名应该与文件名相同public class包含在该文件中 为什么这是一个限制 它有什么目的 Java 有一个有趣的方法 如果给
  • AWS SDK 2 承担角色

    Bean public DynamoDbClient amazonDynamoDB final AssumeRoleRequest assumeRoleRequest AssumeRoleRequest builder roleSessio
  • Apache Commons VFS - 无法解析文件

    VFS 方法无法处理此 URI jboss server temp dir local outgoing配置在jboss beans xml这是决心 C Download jboss eap 5 1 1 server default tmp
  • Java - toString 到 Color

    我一整天都在努力解决这个问题 基本上我做了一个 for 循环 将条目添加到数组列表中 其中一项是 颜色 变量 我已经用过random nextInt为颜色构造函数的红色 绿色和蓝色部分创建新值 我还设置了一个toString方法 这样我就可
  • JPA 的 Hibernate 查询提示

    我一直在尝试为所有可以通过设置的提示找到一个明确的资源Query setHint String Object JPA 中的方法调用 但我一无所获 有人知道一个好的参考吗 See 3 4 1 7 查询提示 http docs jboss or
  • EJB 中 @Stateless 相对于 @Singleton 的真正用例是什么

    如果我正确理解EJB Singleton实际上与普通Java中的Singleton相同 也是spring中的单例 gt 一个实例 每个调用同时通过同一个实例 Stateless 声明一个 bean 它可以 但不得 具有多个实例 但限制是一个
  • 如何从 Trie 中检索给定长度的随机单词

    我有一个简单的 Trie 用来存储大约 80k 长度为 2 15 的单词 它非常适合检查字符串是否是单词 但是 现在我需要一种获取给定长度的随机单词的方法 换句话说 我需要 getRandomWord 5 来返回 5 个字母的单词 所有 5
  • 在片段之间切换时底部导航栏会向下推

    在我的活动中 我有一个底部导航栏和框架布局来显示片段 一切正常 但问题是当我开始按顺序从 1 4 移动时 底部导航栏保持在其位置 但当我突然从 4 跳到2 然后底部导航栏就会超出屏幕 当再次单击同一项目时 它就会回到正常位置 该视频将清楚地
  • 测量 tomcat 的排队请求数

    因此 使用tomcat 您可以设置acceptCount值 默认为100 这意味着当所有工作线程都忙时 新连接被放置在队列中 直到队列满 之后它们被拒绝 我想要的是监视此队列中项目的大小 但无法确定是否有办法通过 JMX 获取此值 即不是队
  • 使用 Commons 或 Guava 将文本文件转换为 Java Set

    我想将文件中的每一行加载到 HashSet 集合中 有没有一种简单的方法可以做到这一点 怎么样 Sets newHashSet Files readLines file charSet 使用番石榴 参考 文件 readLines http
  • 通过向上转换将 Java.sql.date 转换为 Java.util.date 安全吗?

    java sql date 扩展了 java util date 那么通过将 java sql date 转换为 java util date 是否可以在两者之间进行转换 或者有其他方法可以转换它们吗 您不一定需要强制转换 您可以将 SQL
  • 调试VS 2005提示“操作不支持”

    我一直在调试 VS 2005 并将 启动外部程序 设置为 C Program Files Microsoft Visual Studio 10 0 Common7 IDE devenv exe 但按 F5 后出现此错误 尝试运行项目时出错
  • Swing:创建可拖动组件...?

    我在网上搜索了可拖动 Swing 组件的示例 但我发现示例不完整或不起作用 我需要的是一个摇摆组件那可以是dragged通过鼠标 在另一个组件内 被拖拽的时候 应该已经 改变它的位置 而不仅仅是 跳 到目的地 我很欣赏无需非标准 API 即
  • 在 for 循环比较中使用集合大小

    Java 中 Collections 的 size 方法是否有编译器优化 考虑以下代码 for int i 0 i

随机推荐

  • Java 中什么时候方法调用可以更改参数,什么时候不可以更改参数? [复制]

    这个问题在这里已经有答案了 这是在java中 我尝试在这里寻找 谷歌搜索这个问题的答案 但找不到足够的答案 所以如果这是重复的 我深表歉意 我对更改您输入的参数的方法背后的规则感到困惑 例如 考虑以下示例 public static voi
  • logback每小时回滚时删除MaxHistory之前的日志

    我使用下面的附加程序 我可以看到回滚每小时发生一次 但我提到了
  • 如何测试包含 gets.chomp 的函数?

    我有一个使用 gets chomp 的简单函数 如下所示 def welcome user puts Welcome What would you like to do action gets chomp end 我想用它来测试它ruby是
  • RAND_MAX 宏:有符号还是无符号?

    我查阅了 C 标准 从 1999 年开始 它只说RAND MAX应该至少为 32767 但没有说明该宏是否应扩展为有符号整数或无符号整数 单一 UNIX 规范 link 1 http pubs opengroup org onlinepub
  • fileprivate 和 private 扩展名之间的区别?

    斯威夫特3 0 我知道fileprivate访问级别修饰符限制对声明它的源文件的函数 属性的使用 并且private 仅限于声明的词法范围 但似乎这条规则不适用于延期 例如 此代码有效 class Foo fileprivate exten
  • 如何从 GoDaddy 导入证书进行 Java 代码签名? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要能够使用 CA 的证书对 jar 文件进行签名 我按照 GoDaddy 文档中有关如何执行此操作
  • oop 中具有状态和行为的对象

    我不断听到术语 对象具有行为和状态 或只是其中之一 但有什么区别或者它意味着什么 如果有人能举一个例子 我将非常感激 灯是一个物体 lamp 中的 状态 开和关 lamp 中的 行为 打开和关闭 在编程中 您在 字段 中声明状态 在 方法
  • 加载 gif 图像在 IE 和 Chrome 中不显示

    我正在使用 JQuery ajax 调用向服务器发送同步调用 并希望显示当时的加载图像 但是加载图像在 Firefox 中可见 但在 IE 和 chrome 中不可见 当我调试时 我发现在 IE 中 当我们调用 java 脚本时 它会停止在
  • MATLAB sgolay(k, f) 的 Python 等效项是什么?

    我在 MATLAB 中有一个函数 b g sgolay k f 它输出一个 f x f 矩阵 当我在 Python 中对相同的 k 和 f 值运行相同的操作时 使用 scipy signal savgol coeffs f k 它输出一个完
  • 在 Bitbucket 中创建拉取请求:错误“不相关的分支”

    我有一个小团队在单个存储库上工作 我要求每个队友创建自己的分支并在该分支上工作 他们所有人都克隆了存储库 然后执行了以下命令 git checkout b BitPankaj BitPankaj是插图分支名称 他们开始在这个分支上工作并通过
  • 我可以使用 LLVM(低级虚拟机)为哪些平台编译二进制文件?

    我对使用 LLVM 的 Clang 编译器感兴趣 LLVM 声称是跨平台的 但尚不清楚可以针对哪些平台 我对此做了很多谷歌搜索 但似乎没有太多关于 LLVM 支持的平台的信息 我唯一发现的是 this http llvm org docs
  • 使用用户的 UID 发送 Firebase 云消息

    我想构建一个 Android 应用程序 允许用户向其他用户发送通知和数据消息 我最近才开始使用 Firebase Firebase 云消息传递对我来说仍然很困惑 我已经实现了向特定的发送消息device使用 Firebase 实例 ID 但
  • 未定义的引用 Json::Value 和 Json::Reader [重复]

    这个问题在这里已经有答案了 当我运行以下代码时 include
  • 从 CSV 文件读取/写入嵌套字典列表 (Python)

    我有一个如下所示的数据结构 data key 1 calc1 42 calc2 3 142 key 2 calc1 123 4 calc2 1 414 key 3 calc1 2 718 calc2 0 577 我希望能够将数据保存 加载到
  • Jenkins 建立健康阈值

    有没有办法改变 Jenkins 根据失败的测试计算构建运行状况的方式 我希望詹金斯治疗any失败的测试不是 阳光明媚 的 但到目前为止 我寻找一种方法来做到这一点还没有结果 标准设置是否允许这种级别的控制 或者是否有插件可以做到这一点 如果
  • 如何在 Android 上将 Google Drive 与 Picasso 集成?

    我正在编写一个在 Google Drive 中存储图像的应用程序 我想显示这些图像的图库 GridView 为了提高性能 即异步 我想将其与Picasso 但是Picasso load String 只是一个别名load Uri parse
  • 来自不同类的特定实例的 Swift 引用变量

    总的来说 我对 Swift 和 iOS 都很陌生 我正在使用 Swift 编写一个应用程序 这个应用程序有两个文件 ViewController swift and BTService swift ViewController swift有
  • 更改控制台中特定字母的颜色

    我正在使用几个形成一个特定的字符串strcat并将其显示到控制台中 该字符串包含以下字符 1 2 3 4 5 6 7 8 9 0 E我正在使用fprintf s 以此目的 例如 2E4137E65922 是代码的可能结果 无论如何我可以写信
  • 如何在 Rails 3 应用程序中分析请求

    如何在 Rails 3 应用程序中分析请求 这个答案 https stackoverflow com questions 2716418 how can i profile a request in rails似乎只适用于 2 我应该如何在
  • Java位移位的奇怪之处

    Java 有 2 个用于右移的位移运算符 gt gt shifts right and is dependant on the sign bit for the sign of the result gt gt gt shifts righ